Asp.net mvc基础(十五)EF原理及SQL监控

EF会自动把Where()、OrderBy()、Select()等这些编译成"表达式树",然后回把表达式树翻译成SQL语句,因此不是"把数据都取到内存中,然后使用集合的方法进行数据过滤",因此性能不会滴。但是如果这个操作不能被翻译成SQL语句,或者报错,或者被放到内存中操作,性能就会非常低。

一、SQL监控

EF进行操作数据库的本质还是通过ADO.NET进行操作数据库。

可以通过DbContext.Database.Log=(sql)=>{ }进行监控EF编译成sql语句的动态。

二、EF延迟查询

1.EF的查询时延迟执行,只有遍历结果集的时候才执行select查询。

2.ToList()或ToArray()时查询就会立即执行

总结:

(1).在延迟查询中,EF会尽可能将多个对数据操作的语句通过编译成表达式树翻译成sql语句进行查询。

比如:

var person_list=list.where(s=>s.Id>2);

var first_person = person_list.First();

不会立即执行,在遍历数据的时候才会执行。

比如:

var person_list=list.where(s=>s.Id>2).ToList();

var first_person = person_list.First();

第一句会立即查询数据,然后将查询到的数据拿到内存中执行第二局进行过滤数据。

(2).使用IEnumerable<T>为变量类型同样会将数据放到内存中,然后在内存中进行后续处理数据,所以必须写成IQueryable<T>

3.每次开始执行的时候,都会执行__MigrationHistory等这些SQL语句,这些语句时DBMigration用的,就是由EF帮我们建数据库。因此可以通过Database.SetInitializer<xxxDBContext>(null);来禁用

一半建议放到XXXDbContext构造函数中。而Database时System.Data.Entity下的类,不是DbContext的Database属性。如果写道DbContext中,最好用上全名,防止出错。

三、执行原始SQL

1.执行非查询语句

调用DbContext的Database属性的ExecuteSqlCommand方法,通过占位符的方式传递参数。

2.执行查询语句

调用DbContext的Database属性的SqlQuery<T>()方法。其中T类的属性需要和查询的结果的列名一致。

原文地址:https://www.cnblogs.com/fengjiqiang123/p/14933184.html