(转载)IQueryable和IEnumerable
第一篇:https://www.cnblogs.com/zgqys1980/p/4047315.html;
第二篇:https://www.cnblogs.com/shenbing/p/5394228.html
第三篇:https://blog.csdn.net/ydm19891101/article/details/50969323
第四篇: (这篇最好,阐释最详尽,最透彻)
下面内容摘自上面第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。
下一篇: C#获取页面上的Html
推荐阅读
-
IEnumerable和IEnumerator详解
-
C# IEnumerable和IEnumerator接口浅析
-
Java并发编程:Callable、Future和FutureTask---转载测试
-
【C#夯实】我与接口二三事:IEnumerable、IQueryable 与 LINQ
-
【转载】C#处理空格和换行
-
【转载】C#中ArrayList集合类和List集合类的比较
-
【转载】C#中List集合中Last和LastOrDefault方法的差别
-
【转载】C#中List集合SingleOrDefault和FirstOrDefault方法有何不同
-
【转载】如何查看自己网站的搜索引擎收录量和索引量
-
Oracle表分区分为四种:范围分区,散列分区,列表分区和复合分区(转载)