来自于:http://www.cnblogs.com/chengxiaohui/articles/2088967.html

IEnumerable<T>在.Net2.0中我们已经很熟悉了.你想要利用Foreach迭代吗?实现 IEnumerable<T>吧!你想直接做为数据源绑定到控件吗?使用IEnumerable吧!是的.只要是序列.它都实现了 IEnumerable<T>(.Net1.0下的序列类除外).除了这些.LINQ的出现.还赋予了 IEnumerable<T>更强悍的功能.IQueryable<T>继承IEnumerable<T>.详细看 IEnumerable<T>和IQueryable<T>这两个API的签名.可以说非常相似.从某种意义上来说.它们是可以 互换的.但是却不总是可以互相代替的.IEnumerable<T>和IQueryable<T>的行为有所不同.其性能方面也 可能天差地别.例如:

var q = from c in dbContext.Customers
where c.City == "shenzhen"
select c;
var q = (from c in dbContext.Customers
where c.City == "shenzhen"
select c).AsEnumerable();

这两个查询看起来几乎一模一样.查询返回的结果也一样.但他们的实现方式却大相径庭.第一个查询使用了LINQ2SQL的处理方式.第二个查询则使 用了LINQ2Object处理.通过前面的学习.我们知道,LINQ2Object的处理结果是把LINQ表达式映射成对应的委托,而LINQ2SQL 则是保存了一系列的"步骤"---表达式树的处理方式.两者的区别简单的理解就是LINQ2Object将数据存放在内存中.而LINQ2SQL则是把数 据存放在远程的服务器中.

场景模拟

举一个例子.现在有两个水果批发商A,B..A除了是批发商,自己还承包了几个果场.自产自销.B和几个大型的果场合作.只做批发工作.每次客人来A订 货.指定要什么货物,A就可以立刻拿出.速度快.服务佳.缺点是由于是自己的果场.那量肯定不大,而且品种不齐全,小作坊式的经营.B呢?每次客户订 单.B是先把客户需要的货物规格等记录下来.一次性去各个果场取货.这样B的优点就是量大.品种多.但速度可能偏慢(收到货的时间).不过若B以A的销售 方式来销售.那么B的效绩肯定是让人十分不满意,工厂式的经营.

总结之,IEnumerable<T>查询必须在本地执行.并且执行查询前我们必须把所有的数据加载到本地.而且更多的时候.加载的数据有大 量的数据是我们不需要的无效数据.但是我们却不得不传输更多的数据.做更多的无用功.而IQueryable<T>却总能只提供你所需要的数 据.大大减少了数据的传输.这就好比我们在小作坊下订单.小作坊老板跟我们说.他的货刚好比你所需要的多出一些.你只能要了它.不然剩下一点他不好卖等 等.而大工厂却不会出现这种状况.

个性要求

虽说小作坊很多弊病.但有时候却有着大工厂无法媲美的服务.假如你需要一种八种水果组合套餐.大工厂一般不会为你量身定做.单对单服务.相反.小作坊客源有限.一般都会满足你的个人需求.

场景切换:在<<[More Effective C#]Lambda表达式优化>>里我们提到过.LINQ2SQL中是不允许出现自定义方法的.这是由于LINQ2SQL的处理方式.详见<<[More Effective C#]Lambda表达式优化>>.而LINQ2Object却能很好的满足我们自定义方法这个性化的要求.

但是.除了自定义方法.还有一些内置的方法IEnumerable<T>和IQueryable<T>是同时支持的.例如常见的string类的操作方法.substring,indexof等等.

尾声

可能这个例子在这里有些牵强.但相信IEnumerable<T>和IQueryable<T>之间的区别不难理解.更多时候我 们在查询序列的时候.要考虑到底是本地查询好.还是远程查询好.至于哪种查询更好.没有绝对的说法.适合应用环境,已经能发挥最大效应的.那就是最好的.

转自:http://www.dotblogs.com.tw/kongyiyun/archive/2010/10/22/18510.aspx

 
 
 
好文要顶 关注我 收藏该文  

IEnumerable,IQueryable之前世今生的更多相关文章

  1. IEnumerable,IQueryable的区别

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

  2. IQueryable和IEnumerable

    使用EF你必须知道这两个的区别,可以帮助我们的提升性能. 表达树:Linq 表达 ①IQueryable和IEnumerable IQueryable 延时执行:扩展方法接受的是Expression( ...

  3. C# IEnumberable & IQueryable 区别

    转自 http://blog.csdn.net/daimeisi123/article/details/46976093 在应用到IEnumberable 和IQueryable两个接口时,代码往往很 ...

  4. IQueryable & IEnumberable 区别

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

  5. LinqToDB 源码分析——轻谈Linq查询

    LinqToDB框架最大的优势应该是实现了对Linq的支持.如果少了这一个功能相信他在使用上的快感会少了一个层次.本来笔者想要直接讲解LinqToDB框架是如何实现对Linq的支持.写到一半的时候却发 ...

  6. MVC中使用Entity Framework 基于方法的查询学习笔记 (三)

    紧接上文,我们已经学习了MVC数据上下文中两个常用的类,这两个类承载着利用函数方式进行数据查询的全部内容,我们既然已经了解了DbSet<TEntity> 是一个泛型集合,并且实现了一些接口 ...

  7. Reactive Extensions(Rx) 学习

    Bruce Eckel(著有多部编程书籍)和Jonas Boner(Akka的缔造者和Typesafe的CTO)发表了“反应性宣言”,在其中尝试着定义什么是反应性应用. 这样的应用应该能够: 对事件做 ...

  8. .NET面试题系列[15] - LINQ:性能

    .NET面试题系列目录 当你使用LINQ to SQL时,请使用工具(比如LINQPad)查看系统生成的SQL语句,这会帮你发现问题可能发生在何处. 提升性能的小技巧 避免遍历整个序列 当我们仅需要一 ...

  9. LINQ语句中的.AsEnumerable() 和 .AsQueryable()的区别

    LINQ语句中的.AsEnumerable() 和 .AsQueryable()的区别 在写LINQ语句的时候,往往会看到.AsEnumerable() 和 .AsQueryable() .例如: s ...

随机推荐

  1. 从零开始学 Java - Spring AOP 拦截器的基本实现

    一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...

  2. spring aop注解配置

    spring aop是面向切面编程,使用了动态代理的技术,这样可以使业务逻辑的代码不掺入其他乱七八糟的代码 可以在切面上实现合法性校验.权限检验.日志记录... spring aop 用的多的有两种配 ...

  3. json和jsonp的区别,ajax和jsonp的区别

    json和jsonp虽然只有一个字母的区别,但是它们之间扯不上关系. json是一种轻量级的数据交换格式. jsonp是一种跨域数据交互协议. json的优点:(1)基于纯文本传递极其简单,(2)轻量 ...

  4. $.extend()的深拷贝和浅拷贝详细讲解

    版权声明:作者原创,转载请注明出处! 语法:jQuery.extend( [deep ], target, object1 [, objectN ] ) 描述: 将两个或更多对象的内容合并到第一个对象 ...

  5. 政府应急平台之GIS一张图-flex/java

    开发语言是flex.java,开发平台是myeclise.eclise,后台数据库是oracel或sqlserver,开发接口是arcgis api for flex,提供以下的功能: 1.视频监控: ...

  6. Android Log Tag含义

    在分析Android问题的时候重要的手段之一就是分析log,在events.log中有很多系统log,其中有些log的含义并不是很了解,下面就是从安卓源码中得到的系统log的tag. 关于Tag的说明 ...

  7. Android 学习心得 TextView 添加垂直滚动条

    XMl文件中: 添加android:scrollbars="vertical" 添加android:maxLines="10"  //设置一页最多显示10行 a ...

  8. 自定义ViewGroup须知

    自定义ViewGroup须知: 1.必须复写onMeasure和onLayout方法,根据容器的特性进行布局设计 2.复写onMeasure方法必须处理父布局设置宽或高为wrap_content情况下 ...

  9. IE10 和 Chrome50 对日期 new Date() 支持的区别

    IE10 和 Chrome50 对日期 new Date() 支持的区别: new Date('2016-06-18'); // IE10 不通过.Chrome 通过 new Date('2016/0 ...

  10. SQL SERVER错误:已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)

    在SSMS(Microsoft SQL Server Management Studio)里面,查看数据库对应的表的时候,会遇到"Lock Request time out period e ...