IQueryable和IEnumerable,IList的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IQueryable和IEnumerable,IList的区别相关的知识,希望对你有一定的参考价值。

参考技术A IQueryable和IEnumerable都是延时执行(Deferred
Execution)的,而IList是即时执行(Eager
Execution)
IQueryable和IEnumerable在每次执行时都必须连接数据库读取,而IList读取一次后,以后各次都不需连接数据库。前两者很容易造成重复读取,性能低下,并且可能引发数据不一致性
IQueryable和IEnumerable的区别:IEnumberalb使用的是LINQ
to
Object方式,它会将AsEnumerable()时对应的所有记录都先加载到内存,然后在此基础上再执行后来的Query。所以上述TestIEnumerable例子中执行的SQL是"select
top(5)
...",然后在内存中选择前两条记录返回。
IList(IList<T>)会立即在内存里创建持久数据,这就没有实现“延期执行(deferred
execution)”,如果被加载的实体有关联实体(associations),此关联实体不会被加载(既不立即加载,也不延迟加载)。
IQeurable(IQuerable<T>)不会立即在内存里创建持久数据,只有遍历它(如通过foreach)、把它转换成List等情况下才会向内存加载数据,它可以实现“延期执行”,如果当前被加载的实体有关联实体(associations),此关联实体可被接下来的访问加载。
IQueryable实现了IEnumberable接口。但IEnumerable<T>
换成IQueryable<T>后速度提高很多。原因:IQueryable<T>不需要将所有数据都读取到内存
IQueryable接口与IEnumberable接口的区别:
IEnumerable<T>
泛型类在调用自己的SKip

Take
等扩展方法之前数据就已经加载在本地内存了,而IQueryable<T>
是将Skip
,take
这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令,它并不是把所有数据都加载到内存里来才进行条件过滤。
IEnumerable跑的是Linq
to
Object,强制从数据库中读取所有数据到内存先。

以上是关于IQueryable和IEnumerable,IList的区别的主要内容,如果未能解决你的问题,请参考以下文章

IQueryable 和 IEnumerable 有啥区别 [重复]

IEnumerable 和 IQueryable

IQueryable 和 IEnumerable 之间差异的真实示例? [复制]

IQueryable和IEnumerable,IList的区别

C# IQueryable和IEnumerable的区别

我的 Entity Framework 存储库和服务层方法应返回哪些类型:List、IEnumerable、IQueryable?