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