博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IEnumerable<T>和IQueryable<T>区别
阅读量:5167 次
发布时间:2019-06-13

本文共 1563 字,大约阅读时间需要 5 分钟。

LINQ查询方法一共提供了两种扩展方法,在System.Linq命名空间下,有两个静态类:Enumerable类,它针对继承了IEnumerable<T>接口的集合进行扩展;Queryable类,针对继承了IQueryable<T>接口的集合进行扩展。我们会发现接口IQueryable<T>实际也是继承了IEnumerable<T>接口的,既然这样微软为什么要设计出两套扩展方法呢?

从LINQ查询功能上我们知道实际上可以分为三类:LINQ to OBJECTS、LINQ to SQL和LINQ to XML。其实为设计这两套接口主要是针对LINQ to OBJECTS和LINQ to SQL,两者对于查询的内部处理机制是完全不同的。针对LINQ to OBJECTS 时,使用Enumerable中的扩展方法对本地集合进行排序和查询操作,查询参数接受的是Func<>,Func<>叫做谓语表达式,相当于一个委托。针对LINQ to SQL时,则使用Queryable中的扩展方法,它接受的是Expression<>。

那么,到底什么时候使用IQueryable<T>,什么时候使用IEnumerable<T>?

首先我们来看一下LINQ to SQL的代码:

using (var context = new NorthwindEntities()){var orderTmp = context.Orders.Where(p=>p.CustomerID=="RATTC");var orders = orderTmp.Where(p => p.OrderDate > new DateTime(1997, 1, 1));foreach (var order in orders){Console.WriteLine("OrderId:" + order.OrderID);}}

通过vs的Intellisense我们可以看到Where的返回类型为IQueryable,参数是Expression类型的:

 

我们再看一下这一段代码:

 

using (var context = new NorthwindEntities()){var orderTmp = context.Orders.Where(p => p.CustomerID == "RATTC").AsEnumerable();var orders = orderTmp.Where(p => p.OrderDate > new DateTime(1997, 1, 1));foreach (var order in orders){Console.WriteLine("OrderId:" + order.OrderID);}}

看一下vs的Intellisense效果:

 

由于我们在LINQ查询的时候加上了AsEnumerable(),因此我们在第二条语句能看到返回类型已经变为IEnumerable,参数也变成了Func<>类型。

至于这两段代码到底有什么区别,我们分别执行代码,在sql profiler里看一下生成的sql语句:

第一段代码效果:

 

 第二代码效果:
 
二者的查询结果一致,只是前者把查询参数合并了。

原因在于Func<>直接会被编译器编译成IL代码,但是Expression<>只是存储了一个表达式树,在运行期作处理,LINQ to SQL最终会将表达式树转为相应的SQL语句,然后在数据库中执行

现在我们应该知道何时使用IEnumerable<T>,何时使用Iqueryable<T>。建议延迟加载数据使用Iqueryable<T>。

转载于:https://www.cnblogs.com/chenh/p/10661917.html

你可能感兴趣的文章
这次要好好吐槽下idea呢还是SpringMVC ?
查看>>
【转】NoSQL初探之人人都爱Redis:(2)Redis API与常用数据类型简介
查看>>
Excel催化剂开源第23波-VSTO开发辅助录入功能关键技术
查看>>
python 列表,元祖,字典
查看>>
秦曾昌人工智能课程---1、机器学习中的数学基础
查看>>
android系统架构
查看>>
数组模拟临街表存储
查看>>
12.5 站立会议
查看>>
SQLServer数据库的一些全局变量
查看>>
Centos-本机网络连接、运行端口和路由表等信息-netstat
查看>>
胡适阅读
查看>>
Java中日期的转化
查看>>
小程序弱网环境卡顿怎么办?一招迅速提升小程序运行速度
查看>>
管线【十八】
查看>>
重温设计模式 - 建造者模式
查看>>
洛谷P1154 奶牛分厩
查看>>
Jquery复习(十)之$.fn.extend()
查看>>
z-index使用及一定要加backgroun
查看>>
面向对象的七种设计原则
查看>>
05-numpy-笔记-fliplr
查看>>