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接口

C# IQueryable及IEnumerable区别解析

2.where条件接收一个谓词表达式(委托)返回一个IEnumerable接口

C# IQueryable及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

标签:C#,IQueryable,IEnumerable
0
投稿

猜你喜欢

  • springboot热部署知识点总结

    2021-08-23 12:05:43
  • 如何优雅的处理Spring Boot异常信息详解

    2023-11-29 09:50:02
  • 利用Distinct()内置方法对List集合的去重问题详解

    2023-01-31 00:45:30
  • C#中DataGridView常用操作实例小结

    2023-03-09 23:55:16
  • C# DataTable.Select()根据条件筛选数据问题

    2021-10-14 16:53:34
  • Android项目开发 教你实现Periscope点赞效果

    2022-02-24 02:29:27
  • 优化spring boot应用后6s内启动内存减半

    2021-09-13 02:47:59
  • JAVA与SQL 中的null与NULL解析

    2023-06-23 11:51:18
  • java 中如何实现 List 集合去重

    2023-10-07 07:54:06
  • word ppt excel文档转换成pdf的C#实现代码

    2022-10-10 16:51:54
  • JDBC连接MySQL并实现模糊查询

    2021-07-06 01:42:28
  • 详解ViewBinding用法

    2023-07-01 21:38:41
  • Java中使用HashMap时指定初始化容量性能解析

    2023-01-01 11:05:27
  • AQS同步组件Semaphore信号量案例剖析

    2023-11-27 14:27:04
  • 轻松学习C#的方法

    2023-06-21 13:22:32
  • Java中常用时间的一些相关方法

    2022-02-06 11:33:38
  • springboot整合quartz项目使用案例

    2023-02-13 19:57:12
  • Java经典面试题最全汇总208道(四)

    2023-11-08 23:59:26
  • Java PreparedStatement用法详解

    2023-08-08 20:20:51
  • springboot访问template下的html页面的实现配置

    2023-02-09 23:33:21
  • asp之家 软件编程 m.aspxhome.com