IList,IQeurable,IEnumble和List 的区别主要如下:

1.IList(IList<T>)会立即在内存里创建持久数据,这就没有实现“延期执行(deferred execution)”,而是一次性将数据加载进来,如果被加载的实体有关联实体(associations),此关联实体不会被加载(既不立即加载,也不延迟加载)

2.IQeurable(IQuerable<T>)不会立即在内存里创建持久数据,只有遍历它(如通过foreach)、把它转换成List等情况下才会向内存加载数据,它可以实现“延期执行”,如果当前被加载的实体有关联实体(associations),此关联实体可被接下来的访问加载。在每次执行时都必须连接数据库读取,而IList读取一次后,以后各次都不需连接数据库。IQeurable 很容易造成重复读取,性能低下,并且可能引发数据不一致性

//IList
IList users = res.ToList(); //此时已把users加载到内存,而每个user的关联实体(UserInfos)未
//被加载,所以下一行代码无法顺利通过
var ss = users.Where(p => p.UserInfos.ID != 3); //此处报错,因为P的UserInfos实体无法被加载 // IQuerable的
IQueryable users = res.AsQueryable(); //users未被立即加载,关联实体可通过“延迟加载”获
//得
var ss = users.Where(p => p.UserInfos.ID != 3);//此处顺利获得对应的ss

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

4.List <>是泛型类,它已经实现了IList <>定义的那些方法,IList<T> list=new List<T>();
只是想创建一个基于接口IList<Class1>的对象的实例,这个接口是由List<T>实现的。只是希望使用到IList<T>接口规定的功能而已

总结:

基于性能和数据一致性这两点,使用IQueryable时必须谨慎,而在大多数情况下我们应使用IList。

  • 当你打算马上使用查询后的结果(比如循环作逻辑处理或者填充到一个table/grid中),并且你不介意该查询即时被执行后的结果可以供调用者(Consummer)作后续查询(比如这是一个"GetAll"的方法),或者你希望该查执行,使用ToList()
  • 当你希望查询后的结果可以供调用者(Consummer)作后续查询(比如这是一个"GetAll"的方法),或者你希望该查询延时执行,使用AsQueryable()
  • 按照功能由低到高:List<T> IList<T>  IQueryable<T> IEnumerable<T>
  • 按照性能由低到高:IEnumerable<T> IQueryable<T> IList<T>  List<T>

参考文档:  http://www.cnblogs.com/xpvincent/p/3605068.html

http://www.cnblogs.com/hiteddy/archive/2011/10/01/Difference_among_IQueryable_IEnumeralb_IList_in_Entity_Framework.html

最新文章

  1. 【leetcode】Roman to Integer
  2. Oracle基本sql操作
  3. java 读取数据库中表定义
  4. Eclipse Memory Analyzer,内存泄漏插件,安装使用一条龙
  5. python基本数据类型之集合set
  6. 64位Windows无法打开会声会影X5的解决方法
  7. sqlplus入门基础语句
  8. 报错:System.Data.Entity.Infrastructure.DbUpdateException 更新条目时出错
  9. oschina数据库相关
  10. 四个流行的Java连接池之Proxool篇
  11. 在向服务器发送请求时发生传输级错误。 (provider: TCP 提供程序, error: 0 - 远程主机强迫关闭了一个现有的连接。)
  12. 介绍一个开源的在线管理SQLServer的小工具--SQLEntMan
  13. C语言中全局变量存放在哪个位置?
  14. 自定义流程gooflow2.0+自定义表单
  15. windows下cmd中命令操作
  16. 微信https抓包,不同安卓版本、微信版本对证书的要求
  17. Write your own Terraform provider: Part 1
  18. Eclipse 快速提取一个方法 (重构)
  19. OpenGL光照设置
  20. Linux终端复用工具 tmux

热门文章

  1. VB中的+与&amp;符号的区别
  2. 黄聪:Discuz X2.5、3.0、3.1、3.2 如何不用插件实现用户名只允许中文注册
  3. (WCF) WCF Service Hosting.
  4. c# 对话框交换数据
  5. Shuffle相关分析
  6. HDU 2897 邂逅明下(巴什博奕)
  7. Linq常用操作
  8. Spring中bean的配置
  9. android 基本知识
  10. C#EasyHook例子C# Hook 指定进程C#注入指定进程 z