C# IQueryable及IEnumerable区别解析
作者:八英里 时间:2021-11-27 13:46:36
在使用EF查询数据的时候,我们常用的查询数据方式有linq to sql,linq to object,
查询返回的结果有两种类型:IQueryable、IEnumerable,两者内部的处理机制是完全不同的。
清楚认识,这里也是一个数据查询的优化点。
在System.linq命名空间,有两个静态类:Queryable和Enumerable.
在System.linq.Queryable中,参数接收的是一个表达式类型,返回IQueryable接口
public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);
在System.linq.Enumerable中,参数接收的是一个谓词表达式,也就是一个委托
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
那么在查询数据使用linq to object的时候,会根据传递的参数不同返回不同的类型.
1.where条件接收表达式,返回IQueryable接口
2.where条件接收一个谓词表达式(委托)返回一个IEnumerable接口
那么什么时候用IQueryable<T>,什么时候用IEnumerable<T>?
1.Func<>谓词表达式,就是一个委托,委托一旦调用,就立即执行了,将执行结果保存在内存中。
2.Expression是一个表达式,会存储拼接表达式树,直到在运行期最终执行。
那么在EF中我们根据条件查询数据时,不应该把数据一次性加载到本地内存中,然后再本地内存中进行筛选,如果数据量大了,就崩溃了。
我们需要将表达式组合好,然后再一起提交到数据库执行,返回查询结果。
(每次在执行where查询操作符的时候IQueryProvider会为我们创建一个新的IQueryable<T>,调用AsEnumerable()方法的时候并不会去实际取值,只是
得到了一个IEnumerable,所以EF在查询数据时候不要先取IEnumerable再去筛选数据。执行ToList方法时才会去真正调用迭代器GetEnumerator()
取值。真正取值时候,会去执行IQueryProvider中的Excute方法.(解析表达式,然后执行取得结果))
这就是IQueryable的延迟加载把.
来源:https://www.cnblogs.com/deepalley/p/13425239.html
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
springboot热部署知识点总结
![](https://img.aspxhome.com/file/2023/7/104017_0s.png)
如何优雅的处理Spring Boot异常信息详解
![](https://img.aspxhome.com/file/2023/6/60536_0s.jpg)
利用Distinct()内置方法对List集合的去重问题详解
C#中DataGridView常用操作实例小结
C# DataTable.Select()根据条件筛选数据问题
Android项目开发 教你实现Periscope点赞效果
![](https://img.aspxhome.com/file/2023/8/110768_0s.gif)
优化spring boot应用后6s内启动内存减半
![](https://img.aspxhome.com/file/2023/3/69903_0s.png)
JAVA与SQL 中的null与NULL解析
![](https://img.aspxhome.com/file/2023/0/72380_0s.png)
java 中如何实现 List 集合去重
![](https://img.aspxhome.com/file/2023/9/58549_0s.webp)
word ppt excel文档转换成pdf的C#实现代码
JDBC连接MySQL并实现模糊查询
详解ViewBinding用法
Java中使用HashMap时指定初始化容量性能解析
AQS同步组件Semaphore信号量案例剖析
![](https://img.aspxhome.com/file/2023/3/60483_0s.png)
轻松学习C#的方法
![](https://img.aspxhome.com/file/2023/3/66573_0s.jpg)
Java中常用时间的一些相关方法
springboot整合quartz项目使用案例
![](https://img.aspxhome.com/file/2023/6/62446_0s.png)
Java经典面试题最全汇总208道(四)
![](https://img.aspxhome.com/file/2023/5/59065_0s.png)
Java PreparedStatement用法详解
![](https://img.aspxhome.com/file/2023/1/58061_0s.png)
springboot访问template下的html页面的实现配置
![](https://img.aspxhome.com/file/2023/5/61085_0s.png)