叶祖辉

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

 

posted on 2017-05-11 18:44  叶祖辉  阅读(204)  评论(0编辑  收藏  举报
友情链接:回力鞋官网 | 中老年女装 | 新航道托福 | 十月英文 | 电影推荐