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(, , ));

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(, , ));

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>。

IEnumerable<T>和IQueryable<T>区别的更多相关文章

  1. IEnumerable,IQueryable的区别

    IEnumerable,IQueryable之前世今生 IEnumerable<T>在.Net2.0中我们已经很熟悉了.你想要利用Foreach迭代吗?实现IEnumerable<T ...

  2. IEnumerable和IQueryable的区别以及背后的ExpressionTree表达式树

    关于IEnumerable和IQueryable的区别,这事还要从泛型委托Func<T>说起.来看一个简单的泛型委托例子: class Program { static void Main ...

  3. 编写高质量代码改善C#程序的157个建议——建议29:区别LINQ查询中的IEnumerable<T>和IQueryable<T>

    建议29:区别LINQ查询中的IEnumerable<T>和IQueryable<T> LINQ查询一共提供了两类扩展方法,在System.Linq命名空间下,有两个静态类:E ...

  4. 对IEnumerable<T>和IQueryable<T>的一点见解

    今天学习了用EF模型做查询,感觉数据库上下文对象的扩展方法很强大,所以研究了一下where的实现原理,其中遇到了一个问题,就是关于IEnumerable和IQueryable的区别,所以查了查资料,这 ...

  5. 编写高质量代码改善C#程序的157个建议[IEnumerable<T>和IQueryable<T>、LINQ避免迭代、LINQ替代迭代]

    前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议29.区别LINQ查询中的IEnumerable<T ...

  6. IEnumerable<T>和IQueryable<T>

    建议29.区别LINQ查询中的IEnumerable<T>和IQueryable<T> LINQ查询方法一共提供了两类扩展方法,在System.Linq命名空间下,有两个静态类 ...

  7. IQueryable & IEnumberable 区别

    Namespace And Inheritances Relations ? 1 2 3 4 5 6 7 8 9 Namespace: System.Collections     [ComVisib ...

  8. IEnumerable<T>与IQueryable<T>以及.net的扩展方法

    首先看看继承关系 public abstract class DbSet : DbQuery public abstract class DbQuery : IOrderedQueryable, IQ ...

  9. IEnumerable和IQueryable的区别

    转自:http://www.cnblogs.com/fly_dragon/archive/2011/02/21/1959933.html IEnumerable接口 公开枚举器,该枚举器支持在指定类型 ...

随机推荐

  1. 分享:大型Web网站架构演变之9大阶段

    前言 我们以Java Web为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变. 该系统具备的功能: 用户模块:用户注册和管理 商品模块:商品展示和管理 交易模块:创建交易和管理 正文 阶 ...

  2. windows下安装和使用scrapy

    首先,要确保已经正确安装了python环境,并安装了pip包 接着,打开cmd或者powershell ,输入命令 pip install scrapy .安装完之后 运行scrapy性能测试命令: ...

  3. pyspider爬虫框架

    特点: 去重处理,结果监控,多进程处理,pyquery提取,错误重试,webUI管理,代码简洁,JS渲染 安装: anaconda里边没搜到pyspider,所以手动安装 查看pyspider的命令: ...

  4. apply和call与this

    函数本身的apply方法,改变this指向哪个对象: function getAge() { var y = new Date().getFullYear(); return y - this.bir ...

  5. Django rest framework(8)---- 视图和渲染器

    django rest framework 之视图 序列化器    PagerSerialiser from rest_framework import serializers from api im ...

  6. linux的挂载含义

    Linux下,mount挂载的作用,就是将一个设备(通常是存储设备)挂接到一个已存在的目录上.访问这个目录就是访问该存储设备.linux操作系统将所有的设备都看作文件,它将整个计算机的资源都整合成一个 ...

  7. Python——Set集合

    一.定义 Set集合用于表示相互之间无需的一种组合对象,包括:并集.交集.补集 二.集合的两种模式 sample = set()  初始化普通集合 sample = frozenset() 初始化不可 ...

  8. Lodop打印表格带页头页尾 高度是否包含页头页尾

    通过设置TableHeightScope,可以实现对ADD_PRINT_TABLE,表格带页头页尾,查看本博客另一篇博文:Lodop打印表格带页头页尾 自动分页每页显示头尾 超文本超过打印项高度,会自 ...

  9. CentOS下添加Root权限用户(超级用户)方法

    1.添加普通用户[root@server ~]# useradd chenjiafa   //添加一个名为chenjiafa的用户[root@server ~]# passwd chenjiafa   ...

  10. Excel Foundation Install

    安装Excel API 函数库 1. 通过下载工具下载函数库 下载 ExcelAPI函数库更新工具   下载 ExcelAPI函数库离线包   ExcelAPI(WPS)函数库离线包      Exc ...