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类的属性需要和查询的结果的列名一致。