技术交流 > 心得分享 > C# IQueryable,IEnumerable和IList的区别

C# IQueryable,IEnumerable和IList的区别

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

(Expression是一个表达式,会存储拼接表达式树,直到在运行期最终执行。)

20160824105834273.jpg

在System.linq.Enumerable中,参数接收的是一个谓词表达式,也就是一个委托

(Func<>谓词表达式,就是一个委托,委托一旦调用,就立即执行了,将执行结果保存在内存中。)

20160824105900179.jpg


1、IQueryable和IEnumerable都是延时执行(Deferred Execution)的,而IList是即时执行(Eager Execution)

2、IQueryable和IEnumerable在每次执行时都必须连接数据库读取,而IList读取一次后,以后各次都不需连接数据库。前两者很容易造成重复读取,性能低下,并且可能引发数据不一致性

3、IQueryable和IEnumerable的区别:IEnumberalb使用的是LINQ to Object方式,它会将AsEnumerable()时对应的所有记录都先加载到内存,然后在此基础上再执行后来的Query。

4、IList(IList)会立即在内存里创建持久数据,这就没有实现“延期执行(deferred execution)”,如果被加载的实体有关联实体(associations),此关联实体不会被加载(既不立即加载,也不延迟加载)。

5、IQeurable(IQuerable)不会立即在内存里创建持久数据,只有遍历它(如通过foreach)、把它转换成List等情况下才会向内存加载数据,它可以实现“延期执行”,如果当前被加载的实体有关联实体(associations),此关联实体可被接下来的访问加载。

6、IQueryable实现了IEnumberable接口。但IEnumerable 换成IQueryable后速度提高很多。原因:IQueryable不需要将所有数据都读取到内存

7、IQueryable接口与IEnumberable接口的区别:  IEnumerable 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存了,而IQueryable 是将Skip ,take 这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令,它并不是把所有数据都加载到内存里来才进行条件过滤。

8、IEnumerable跑的是Linq to Object,强制从数据库中读取所有数据到内存先。


2022-06-28 19:49:12
评论
  • 评论加载中...

评论内容: