欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

(转载)IQueryable和IEnumerable

程序员文章站 2022-06-18 09:57:35
第一篇:https://www.cnblogs.com/zgqys1980/p/4047315.html; 第二篇:https://www.cnblogs.com/shenbing/p/5394228.html 第三篇:https://blog.csdn.net/ydm19891101/articl ......

第一篇:https://www.cnblogs.com/zgqys1980/p/4047315.html

第二篇:https://www.cnblogs.com/shenbing/p/5394228.html

第三篇:https://blog.csdn.net/ydm19891101/article/details/50969323

 

第四篇:  (这篇最好,阐释最详尽,最透彻)

(转载)IQueryable和IEnumerable

下面内容摘自上面第4篇博客,非本人原创:

那么什么时候用iqueryable,什么时候用ienumerable?

1.func<>谓词表达式,就是一个委托,委托一旦调用,就立即执行了,将执行结果保存在内存中。

2.expression是一个表达式,会存储拼接表达式树,直到在运行期最终执行。

那么在ef中我们根据条件查询数据时,不应该把数据一次性加载到本地内存中,然后再本地内存中进行筛选,如果数据量大了,就崩溃了。

我们需要将表达式组合好,然后再一起提交到数据库执行,返回查询结果。

(每次在执行where查询操作符的时候iqueryprovider会为我们创建一个新的iqueryable,调用asenumerable()方法的时候并不会去实际取值,只是

得到了一个ienumerable,所以ef在查询数据时候不要先取ienumerable再去筛选数据。执行tolist方法时才会去真正调用迭代器getenumerator()
取值。真正取值时候,会去执行iqueryprovider中的excute方法.(解析表达式,然后执行取得结果))

这就是iqueryable的延迟加载把.

.知识点总结

  (1) 解决查询多次的问题,因iqueryable延迟加载,当用到集合的时候,provider会解析表达式,然后生成查询,所以会走一个复杂的过程。

  (2) 本地集合:list,array,ienumable都是本地集合,都是缓存在里面的

  (3) 使用ef管理上下文实例的最佳选择是线程的唯一。

  (4) ienumerable接口是一个公开枚举器,该枚举器支持在指定的集合上进行简单迭代,也就是次接口可以直接使用foreach遍历次object。

(转载)IQueryable和IEnumerable