2019.03.22 读书笔记 Linq中的IEnumerable与IQueryable

时间:2023-03-09 22:39:12
2019.03.22 读书笔记 Linq中的IEnumerable与IQueryable

Linq主要分为 Linq to object 、Linq to XML 、Linq to sql(现在都用EF了)。

针对object和sql,微软分别设计了两套接口IEnumerable、IQueryable(其中IQueryable继承与IEnumerable), 针对LINQ to OBJECTS时,使用Enumerable中的扩展方法对本地集合进行排序和查询等操作,查询参数接受的是Func<>。Func<>叫做谓语表达式,相当于一个委托。针对LINQ to SQL时,则使用Queryable中的扩展方法,它接受的是Expression<>。Expression<>用于包装Func<>。LINQ to SQL最终会将表达式树转换成相应的SQL语句,然后在数据库中执行。

简单的说:本地数据源用IEnumerable<T>,远程数据源用IQueryable<T>

首先 linq分为立即查询和延时查询,比如求和、最大值等操作时,是立即执行,并返回结果,而如果只是结果集的话,只有在foreach的时候才会去真正的查询,如果永远不foreach,那么代码只是会编译,并不会去执行查询,这就是延迟查询。

采用延迟执行方式的查询运算符可以另外分类为流式和非流式。
          ①流式运算符不需要在生成元素前读取所有源数据。在执行时,流式运算符一边读取每个源元素,一边对该源元素执行运算,并在可行时生成元素。流式运算符将持续读取源元素直到可以生成结果元素。这意味着可能要读取多个源元素才能生成一个结果元素。
          ②非流式运算符必须读取所有源数据才能生成结果元素。诸如排序和分组等运算属于此类别。在执行时,非流式查询运算符读取所有源数据,将其放入数据结构中,执行运算,然后生成结果元素。

那么IE与IQ的差别是:你连续写多条linq,IE会查询多次,而IQ会组装成一次。

另外附文很好的linq博文:http://www.cnblogs.com/liqingwen/p/5801249.html