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

IQeurable(IQuerable<T>):不在内存加载持久数据,因为这家伙只是在组装SQL,(延迟执行) 到你要使用的时候,例如 list.Tolist() or list.Count()的时候,数据才从数据库进行加载 (AsQueryable())。

IList(IList<T>):泛型接口是 ICollection 泛型接口的子代,作为所有泛型列表的基接口,在用途方面如果作为数据集合的载体这是莫有问题的,只是如果需要对集合做各种的操作,例如 排序 编辑 统计等等,它不行。

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

抽象场景:
其实在我们之前没有使用 ORM 的的很久很久以前,我们 在ADO.net 里面使用的 DataReader 和 DataAdapter or DataSet 和这几个货的基本原理都接近的,就是读取数据的时候,一个必须独占着数据库的连接,而另一个就是先把数据库的的局加载到了自己本地,然后再进行操作。
举个简单的例子就是: 一般的火锅都有专门的调料桌,像我我喜欢芝麻酱,我就拿了一个,回来就开刷了,B君比较大条,不管喜不喜欢拿了十几种调料过来,而C君比较理性,他把自己不喜欢的都排除了,然后一个个针对性的拿过来。

使用场景模拟:

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

总结:

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

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

IQueryable、IEnumberable 、IList与List区别的更多相关文章

  1. C#中IEnumerable、ICollection、IList、IQueryable 、IQueryable 、List之间的区别

    一:一个简单的例子 int[] myArray = { 1, 32, 43, 343 }; IEnumerator myie = myArray.GetEnumerator(); myie.Reset ...

  2. Entity Framework中IQueryable, IEnumerable, IList的区别[转]

    使用工具追踪EF生成的SQL 使用Entity Framework等ORM框架的时候,SQL对于使用者来说是透明的,往往很多人也不关心ORM所生成的SQL,然而系统出现性能问题的时候就必须关注生成的S ...

  3. Entity Framework中IQueryable, IEnumerable, IList的区别(转载)

    原文:http://www.cnblogs.com/hiteddy/archive/2011/10/01/Difference_among_IQueryable_IEnumeralb_IList_in ...

  4. IQueryable,IEnumerable,IList区别

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

  5. Entity Framework中使用IEnumerable<T>、IQueryable<T>及IList<T>的区别

    1. IEnumerable<T> IEnumerable<T> :对于在内存中集合上运行的方法,返回的可枚举对象将捕获传递到方法的参数.在枚举该对象时,将使用查询运算符的逻辑 ...

  6. IQueryable & IEnumberable 区别

    Namespace And Inheritances Relations ? 1 2 3 4 5 6 7 8 9 Namespace: System.Collections     [ComVisib ...

  7. Entity Framework中IQueryable, IEnumerable, IList的区别

    博客园里有这样的总结.这里姑且先列个题目, 提醒自己记忆.

  8. 说说C#中IList与List区别

    首先IList 泛型接口是 ICollection 泛型接口的子代,并且是所有泛型列表的基接口. 它仅仅是所有泛型类型的接口,并没有太多方法可以方便实用,如果仅仅是作为集合数据的承载体,确实,ILis ...

  9. MVC中一般为什么用IQueryable而不是用IList?用IQueryable比IList好在哪?

    IList(IList<T>)会立即在内存里创建持久数据,这就没有实现"延期执行(deferred execution)",如果被加载的实体有关联实体(associat ...

随机推荐

  1. php单例模式封装数据库操作类增删改查

    <?php//三私一公 单例class Db{ //数据库连接对象 private static $instance; private static $table_name; private $ ...

  2. ACWing 238 银河英雄传说

    最近带权并查集这块比较薄弱,直接看食物链看不懂,就老实一步步来了. 有一个划分为N列的星际战场,各列依次编号为1,2,…,N. 有N艘战舰,也依次编号为1,2,…,N,其中第i号战舰处于第i列. 有T ...

  3. OpenGL 编程指南 (1)

    1.在OpenGL3.0(包含3.0)前,或者使用兼容模式(compatibility profile)环境,OpenGL还包含一个固定功能管线(fixed-function pipeline),这时 ...

  4. vs2010安装

    1.网盘上2010安装包可用,先下载到电脑上,然后找到setup文件,安装即可 2.下载插件,基本的文本对齐,tab键补齐等功能 3.测试hello world程序 4.出现的问题 一个文件夹下有多个 ...

  5. Map中放入对象字符串转义问题

    在做Zuul网关日志处理的时候,有以下需求: (1)记录请求成功的日志,要求记录请求返回的结果. 遇到的问题: (1)当请求的结果事对象时,会将其转成字符串,在put进map的时候,字符串就会被转义 ...

  6. Oracle VM VirtualBox - ping不通虚拟机

    问题描述 用Oracle VM VirtualBox创建虚拟机后,本机电脑ping不通虚拟机 解决方案 https://www.cnblogs.com/ranrongzhen/p/6958485.ht ...

  7. MySql 中关键字 case when then else end 的用法

    解释: SELECT case -------------如果 ' then '男' -------------sex='1',则返回值'男' ' then '女' -------------sex= ...

  8. java基础(三)之面向对象编程

    对象的创建方法 语法: class 类名{ 属性; 方法; } 生成对象的方法 类名 对象名 = new 类名(); Dog dog = new Dog(); 对象的使用方法1.对象.变量;2.对象. ...

  9. css 页面滚动 多背景固定不动

    经常看到一些网站,滚动页面但是背景图不会跟着滚动,好像一直固定在浏览器窗口,感觉挺酷的,哇哦 ~ ~ 原来都是 background-attachment 这位大兄弟的功劳 background-at ...

  10. ts中的类

    TypeScript 除了实现了所有 ES6 中的类的功能以外,还添加了一些新的用法(部分ES7). 一.ES6中类的主要用法: 1.使用 class 定义类,使用 constructor 定义构造函 ...