EF原理
EF 会自动把 Where()、OrderBy()、Select()等这些编译成“表达式树(Expression Tree)”,然后会把表达式树翻译成 SQL 语句去执行。(编译原理,AST)因此不是“把数据都取到内存中,然后使用集合的方法进行数据过滤”,因此性能不会低。但是如果这个操作不能被翻译成 SQL 语句,则或者报错,或者被放到内存中操作,性能就会非常低
跟踪EF的查询Sql语句:
DbContext 有一个 Database 属性,其中的 Log 属性,是 Action委托类型,也就是可以指向一个 void A(string s)方法,其中的参数就是执行的 SQL 语句,每次 EF 执行 SQL 语句的时候都会执行 Log。因此就可以知道执行了什么 SQL。
执行原始sql语句
执行非查询语句,调用 DbContext 的 Database 属性的 ExecuteSqlCommand 方法,可以通过占位符的方式传递参数:
更新语句
ctx.Database.ExecuteSqlCommand("update T_Persons set Name={0},CreateDateTime=GetDate()","zjf");
占位符的方式不是字符串拼接,经过观察生成的 SQL 语句,发现仍然是参数化查询,因此不会有 SQL 注入漏洞。
查询语句:
var q1 = ctx.Database.SqlQuery("select Name,Count(*) Count from T_Persons where Id>{0} andCreateDateTime<&#