博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IQueryable和IEnumerable,IList的区别
阅读量:5815 次
发布时间:2019-06-18

本文共 976 字,大约阅读时间需要 3 分钟。

  1. IQueryable和IEnumerable都是延时执行(Deferred Execution)的,而IList是即时执行(Eager Execution)
  2. IQueryable和IEnumerable在每次执行时都必须连接数据库读取,而IList读取一次后,以后各次都不需连接数据库。前两者很容易造成重复读取,性能低下,并且可能引发数据不一致性
  3. IQueryable和IEnumerable的区别:IEnumberalb使用的是LINQ to Object方式,它会将AsEnumerable()时对应的所有记录都先加载到内存,然后在此基础上再执行后来的Query。所以上述TestIEnumerable例子中执行的SQL是"select top(5) ...",然后在内存中选择前两条记录返回。
  4. IList(IList<T>)会立即在内存里创建持久数据,这就没有实现“延期执行(deferred execution)”,如果被加载的实体有关联实体(associations),此关联实体不会被加载(既不立即加载,也不延迟加载)。
  5. IQeurable(IQuerable<T>)不会立即在内存里创建持久数据,只有遍历它(如通过foreach)、把它转换成List等情况下才会向内存加载数据,它可以实现“延期执行”,如果当前被加载的实体有关联实体(associations),此关联实体可被接下来的访问加载。
  6. IQueryable实现了IEnumberable接口。但IEnumerable<T> 换成IQueryable<T>后速度提高很多。原因:IQueryable<T>不需要将所有数据都读取到内存
  7. IQueryable接口与IEnumberable接口的区别:  IEnumerable<T> 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存了,而IQueryable<T> 是将Skip ,take 这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令,它并不是把所有数据都加载到内存里来才进行条件过滤。
  8. IEnumerable跑的是Linq to Object,强制从数据库中读取所有数据到内存先。

转载于:https://www.cnblogs.com/May-day/p/5663899.html

你可能感兴趣的文章
js之无缝滚动
查看>>
Django 多表联合查询
查看>>
logging模块学习:basicConfig配置文件
查看>>
Golang 使用 Beego 与 Mgo 开发的示例程序
查看>>
ntpdate时间同步
查看>>
+++++++子域授权与编译安装(一)
查看>>
asp.net怎样在URL中使用中文、空格、特殊字符
查看>>
ASA5585-S20测试方案
查看>>
路由器发布服务器
查看>>
实现跨交换机VLAN间的通信
查看>>
jquery中的data-icon和data-role
查看>>
常见概率分布及python实现
查看>>
Java中的访问权限
查看>>
MySQL索引底层实现
查看>>
Excel 2010 如何将筛选后的数据复制粘贴到另一个工作表筛选后的表格里
查看>>
python例子
查看>>
环境变量(总结)
查看>>
PHP垃圾回收机制
查看>>
linux socket网络编程 线程池实现客服端程序
查看>>
thinkphp5中的一些关于命名空间的tisp
查看>>