IQueryable接口与IEnumberable区别

Posted 叶祖辉

tags:

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

IEnumerable<T> 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了,而IQueryable<T> 是将Skip ,take 这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令。也是延迟在我要真正显示数据的时候才执行

演示linq to ef中使用IEnumberable与IQueryable的区别,要用到的SQL Server Profiler工具

下面是 IQueryable<T> :

var student = (from s in stuEntities.Student
          orderby s.StudentID
              select s).Skip(3).Take(3);

生成的SQL:

SELECT * FROM (
select ROW_NUMBER() over(order by id)as row,* from [T_Scripts]
)as t1 where t1.row > 3 and t1.row <= 6


下面是 IEnumerable<T>:

var student = (from s in stuEntities.Student
          orderby s.StudentID
              select s).AsEnumerable().Skip(3).Take(3);

生成的SQL:

SELECT * FROM [T_Scripts]

从上面的执行结果可以看出来, IQueryable 是先将所有LINQ语句转换成命令树,然后通过SQL执行
而IEnumerable就是在 AsEnumerable 之前就立刻生成了SQL语句,后面再由程序Skip,Take

 

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

EF入门 IQueryable和IEnumberable的区别

.Take() 的行为如何根据我在左侧使用的接口参考发生变化。 IQueryable 与 IEnumerable

2.3 IQueryable与 IEnumerable的区别

IQueryable、ICollection、IList 和 IDictionary 接口之间的区别

2017.5.12总结

如何检查 IQueryable<T>.Element 类型是不是为接口