时间:2021-07-01 10:21:17 帮助过:22人阅读
占位符的方式不是字符串拼接,经过观察生成的 SQL 语句,发现仍然是参数化查询,因此不会有 SQL 注入漏洞。
查询语句:
var q1 = ctx.Database.SqlQuery<Item1>("select Name,Count(*) Count from T_Persons where Id>{0} and CreateDateTime<={1} group by Name"
返回值是 DbRawSqlQuery<T> 类型,也是实现了 IEnumerable 接口
类似于 ExecuteScalar 的操作比较麻烦:
int c = ctx.Database.SqlQuery<int>("select count(*) from T_Persons").SingleOrDefault();
EF中的对象状态:
Detached(游离态,脱离态)、Unchanged(未改变)、Added(新增)、Deleted(删除)、Modified(被修改)。
转换图
Add()、Remove()修改对象的状态。所有状态之间几乎都可以通过: Entry(p).State=xxx 的方式 进行强制状态转换
EF 优化的一个技巧
如果查询出来的对象 只是供显示使用,不会修改、删除后保存,那么可以使用AsNoTracking()来使得查询出来的对象是 Detached 状态,这样对对象的修改也还是 Detached状态,EF 不再跟踪这个对象状态的改变,能够提升性能。
var p1 = ctx.Persons.Where(p => p.Name == "rupeng.com").FirstOrDefault(); Console.WriteLine(ctx.Entry(p1).State);
改成:
var p1 = ctx.Persons.AsNoTracking().Where(p => p.Name == "rupeng.com").FirstOrDefault(); Console.WriteLine(ctx.Entry(p1).State);
因为 AsNoTracking()是 DbQuery 类(DbSet 的父类)的方法,所以要先在 DbSet 后调用AsNoTracking()。
EF中执行sql语句
标签:字符 from 方式 父类 接口 返回 scalar 技术分享 name