C#IQueryable和IEnumerable的区别

 我来答
greystar_cn
2017-11-06 · 知道合伙人软件行家
greystar_cn
知道合伙人软件行家
采纳数:16407 获赞数:17260
本人主要从事.NET C#方向的技术开发工作,具有10多年的各类架构开发工作经验。

向TA提问 私信TA
展开全部

在使用EF查询数据的时候,我们常用的查询数据方式有linq to sql,linq to object,

查询返回的结果有两种类型:IQueryable、IEnumerable,两者内部的处理机制是完全不同的。

清楚认识,这里也是一个数据查询的优化点。

在System.linq命名空间,有两个静态类:Queryable和Enumerable.

在System.linq.Queryable中,参数接收的是一个表达式类型,返回IQueryable接口

[csharp] view plain copy print?

  • public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);  

  • public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);

  • 在System.linq.Enumerable中,参数接收的是一个谓词表达式,也就是一个委托
  • [csharp] view plain copy print?

  • public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);  

  • 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的延迟加载把.

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式