当前位置:Gxlcms > 数据库问题 > EF中执行sql语句

EF中执行sql语句

时间:2021-07-01 10:21:17 帮助过:22人阅读

.ExecuteSqlCommand("update T_Persons set Name={0},CreateDateTime=GetDate()","zjf");

占位符的方式不是字符串拼接,经过观察生成的 SQL 语句,发现仍然是参数化查询,因此不会有 SQL 注入漏洞。

 

查询语句:

  1. <span style="color: #ff00ff">var</span> q1 <span style="color: #808080">=</span> ctx.<span style="color: #0000ff">Database</span>.SqlQuery<span style="color: #808080"><</span>Item1<span style="color: #808080">></span>("<span style="color: #0000ff">select</span> Name,<span style="color: #ff00ff">Count</span>(<span style="color: #808080">*</span>) <span style="color: #ff00ff">Count</span> <span style="color: #0000ff">from</span> T_Persons <span style="color: #0000ff">where</span> Id<span style="color: #808080">></span>{<span style="color: #800000; font-weight: bold">0</span>} <span style="color: #808080">and </span><span style="color: #000000">CreateDateTime</span><span style="color: #808080"><=</span>{<span style="color: #800000; font-weight: bold">1</span>} <span style="color: #0000ff">group</span> <span style="color: #0000ff">by</span> Name"

返回值是 DbRawSqlQuery<T> 类型,也是实现了 IEnumerable 接口

 

类似于 ExecuteScalar 的操作比较麻烦:

  1. <span style="color: #0000ff">int</span> c <span style="color: #808080">=</span> ctx.<span style="color: #0000ff">Database</span>.SqlQuery<span style="color: #808080"><</span><span style="color: #0000ff">int</span><span style="color: #808080">></span>("<span style="color: #0000ff">select</span> <span style="color: #ff00ff">count</span>(<span style="color: #808080">*</span>) <span style="color: #0000ff">from</span> T_Persons").SingleOrDefault();

 

EF中的对象状态:

 Detached(游离态,脱离态)、Unchanged(未改变)、Added(新增)、Deleted(删除)、Modified(被修改)。

转换图

技术分享

Add()、Remove()修改对象的状态。所有状态之间几乎都可以通过: Entry(p).State=xxx 的方式 进行强制状态转换

 

 EF 优化的一个技巧

如果查询出来的对象 只是供显示使用,不会修改、删除后保存,那么可以使用AsNoTracking()来使得查询出来的对象是 Detached 状态,这样对对象的修改也还是 Detached状态,EF 不再跟踪这个对象状态的改变,能够提升性能。

  1. <span style="color: #0000ff">var</span> p1 = ctx.Persons.Where(p => p.Name == <span style="color: #800000">"</span><span style="color: #800000">rupeng.com</span><span style="color: #800000">"</span><span style="color: #000000">).FirstOrDefault();
  2. Console.WriteLine(ctx.Entry(p1).State);</span>

改成:

  1. <span style="color: #0000ff">var</span> p1 = ctx.Persons.AsNoTracking().Where(p => p.Name == <span style="color: #800000">"</span><span style="color: #800000">rupeng.com</span><span style="color: #800000">"</span><span style="color: #000000">).FirstOrDefault();
  2. Console.WriteLine(ctx.Entry(p1).State);</span>

因为 AsNoTracking()是 DbQuery 类(DbSet 的父类)的方法,所以要先在 DbSet 后调用AsNoTracking()。

EF中执行sql语句

标签:字符   from   方式   父类   接口   返回   scalar   技术分享   name   

人气教程排行