13.区别LINQ查询中的IEnumerable<T>和IQueryable<T># LINQ查询方法一共提供了两类扩展方法,在System.Linq命名空间下,有两个静态类:Enumerable类,它针对继承了...IEnumerable<T>接口的集合类进行扩展;Queryable类,它针对继承了IQueryable<T>接口的集合类进行扩展。...那么,到底什么时候使用IQueryable<T>,什么时候使用IEnumerable<T>呢?简单表述就是:本地数据源用IEnumerable<T>,远程数据源用IQueryable<T>。...注意 在使用IQueryable<T>和IEnumerable<T>的时候还需要注意一点,IEnumerable<T>查询的逻辑可以直接用我们自己所定义的方法,而IQueryable<T>则不能使用自定义的方法...在使用IQueryable<T>查询的时候,如果使用自定义的方法,则会抛出异常。 13.使用LINQ取代集合中的比较器和迭代器# LINQ提供了类似于SQL的语法来实现遍历、筛选与投影集合的功能。
扩展方法(又称为标准查询) System.Linq.Enumerable类和System.Linq.Queryable类,分别针对IEnumerable和IQueryable接口进行的扩展。...NET也提供了几个对IEnumerable和IQueryable接口进行操作的扩展方法,如: Cast和OfType。...表达式和扩展方法在编译后的代码没有什么区别 对于排序、分组、联合查询使用LINQ表达式更为方便 //以排序为例,使用年龄、姓名、邮箱进行排序, //LINQ表达式中使用逗号分隔排序字段,而扩展方法则需要多次调用相应的扩展方法...LINQ查询特点: 延迟查询 若查询表达式的返回结果是IEnumerable类型,则在声明查询表达式时不会执行查询,而是在迭代查询变量时才进行查询。...IQueryable适合使用对进程外(如数据库)的数据进行查询操作,如:LINQ to Entities。
本文主要学习记录以下内容: 建议29、区别LINQ查询中的IEnumerable和IQueryable 建议30、使用LINQ取代集合中的比较器和迭代器 建议31、在LINQ查询中避免不必要的迭代...建议29、区别LINQ查询中的IEnumerable和IQueryable LINQ查询方法一共提供了两类扩展方法,在System.Linq命名空间下,有两个静态类: Enumerable...针对LINQ to OBJECTS时,使用Enumerable中的扩展方法对本地集合进行排序和查询等操作,查询参数接受的是Func。Func叫做谓语表达式,相当于一个委托。...那么到底什么时候使用IQueryable,什么时候使用IEnumerable呢?...在使用IQueryable和IEnumerable的时候还需要注意一点,IEnumerable查询的逻辑可以直接用我们自己所定义的方法,IQueryable则不能使用自定义的方法
IEnumerable接口 公开枚举器,该枚举器支持在指定类型的集合上进行简单迭代。...也就是说:实现了此接口的object,就可以直接使用foreach遍历此object; IQueryable 接口 它继承 IEnumerable 接口,而因为.net版本加入Linq和IQueryable...第一种:直接返回 IQueryable类型的查询,如下图所示: 第二种:在用分页查询之前先将其转换成 IEnumerable实际执行的sql如下图所示: 总结 IQueryable接口与IEnumberable...接口的区别: IEnumerable 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了,而IQueryable 是将Skip ,take 这些方法表达式翻译成...T-SQL语句之后再向SQL服务器发送命令,它并不是把所有数据都加载到内存里来才进行条件过滤。
下面内容摘自上面第4篇博客,非本人原创: 那么什么时候用IQueryable,什么时候用IEnumerable?...(每次在执行where查询操作符的时候IQueryProvider会为我们创建一个新的IQueryable,调用AsEnumerable()方法的时候并不会去实际取值,只是 得到了一个IEnumerable...执行ToList方法时才会去真正调用迭代器GetEnumerator() 取值。真正取值时候,会去执行IQueryProvider中的Excute方法....(2) 本地集合:List,Array,IEnumable都是本地集合,都是缓存在里面的 (3) 使用EF管理上下文实例的最佳选择是线程的唯一。 ...(4) IEnumerable接口是一个公开枚举器,该枚举器支持在指定的集合上进行简单迭代,也就是次接口可以直接使用foreach遍历次Object。 ?
转自 http://www.cnblogs.com/fly_dragon/archive/2011/02/21/1959933.html IEnumerable接口 公开枚举器,该枚举器支持在指定类型的集合上进行简单迭代...也就是说:实现了此接口的object,就可以直接使用foreach遍历此object; IQueryable 接口 它继承 IEnumerable 接口,而因为.net版本加入Linq和IQueryable...第一种:直接返回 IQueryable类型的查询,如下图所示: ? 第二种:在用分页查询之前先将其转换成 IEnumerable实际执行的sql如下图所示: ?...总结 IQueryable接口与IEnumberable接口的区别: IEnumerable 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了,而IQueryable... 是将Skip ,take 这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令,它并不是把所有数据都加载到内存里来才进行条件过滤。
提升从数据库中拿数据的速度,可以参考以下几种方法: 1).在数据库中的表中定义合适的索引和键 2).只获得你需要的列(使用ViewModel或者改进查询)和行(使用IQueryable)...Enumerable这个静态类型含有很多扩展方法,其扩展的目标是IEnumerable。 实现了这个接口的类可以使用Foreach关键字进行迭代(迭代的意思是对于一个集合,可以逐一取出元素并遍历之)。...---->详解 6.IEnumerable的缺点有哪些? IEnumerable功能有限,不能插入和删除。 访问IEnumerable只能通过迭代,不能使用索引器。...一般来说,返回另外一个序列(通常为IEnumerable或IQueryable)的操作,使用延迟执行,而返回单一值的运算,使用立即执行。...LINQ to Object的数据源总是实现IEnumerable(所以不如叫做LINQ to IEnumerable),相对的,LINQ to SQL的数据源总是实现IQueryable并使用Queryable
LINQ查询Object是基于IEnumerable对象的,不是集合对象有什么好查的。...2.2】.通过继承IEnumerable接口 我想大部分的情况下我们都是直接使用IEnumerable的实现类,但是在编写系统组件、框架的时候一般都是要自己去实现自己的迭代器类的。...很多场合下我们需要自己去构建延迟加载特性的功能,在IEnumerable对象中构建延迟基本上是通过yield return 去构建一个状态机,当进行迭代的时候才进行数据的返回操作。...这个方法有一个参数,是条件表达式,并且这个方法扩展IQueryable接口,任何派生着都能直接使用。...方法的返回类型也是IQueryable类型,返回类型和扩展类型相同就已经构成链式编程的最小环路。
使用情况通常是:当有非常多的在头尾进行的插入删除操作,却只有很少的访问操作时。(例如不需要索引器)。如果插入删除总是在中间进行,链表的性能和数组相差无几。...方法 提供add, remove, insert等功能 提供转换为IQueryable方法 LinkedList 没有索引,通过Find方法 ICollection 内部使用链表实现的列表...替代作为返回类型 IQueryable 通过IndexOf IEnumerable 从远端获得筛选之后的资料,和IEnumerable不同,IQueryable返回所有资料然后才进行筛选...有了泛型版本的字典,我们几乎永远不需要使用非泛型的HashTable。...它赋予集合迭代的能力。迭代是指从集合的头部,一个一个将元素拿出来,直到全部拿完为止的操作。迭代不能倒车,只能前进。IEnumerable是迭代器模式的实现。
LINQ查询方法一共提供了两种扩展方法,在System.Linq命名空间下,有两个静态类:Enumerable类,它针对继承了IEnumerable接口的集合进行扩展;Queryable类,针对继承了...针对LINQ to OBJECTS 时,使用Enumerable中的扩展方法对本地集合进行排序和查询操作,查询参数接受的是Func,Func叫做谓语表达式,相当于一个委托。...针对LINQ to SQL时,则使用Queryable中的扩展方法,它接受的是Expression。 那么,到底什么时候使用IQueryable,什么时候使用IEnumerable?...至于这两段代码到底有什么区别,我们分别执行代码,在sql profiler里看一下生成的sql语句: 第一段代码效果: ?...现在我们应该知道何时使用IEnumerable,何时使用Iqueryable。
为了很形象的表达链式设计模式的使用方式,这里我使用一个比较简单的小例子来展示它的设计理念和使用方式。 例子说明:假设我有一个表示学生的对象类型还有一个表示学生集合的类型。...里面是使用IEnumerable作为迭代器对象的实现接口,所以在System.Linq.Enumerable静态类中全部是封装了对IEnumerable接口的链式查询方法,这些方法都是通过扩展方法提供的...在使用IEnumerable和IQueryable之间的区别是什么?如何很好的理解这两者在LINQ的整个框架中的关系。...泛型的IEnumerable接口继承自IEnumerable接口,该接口表示可迭代的数据集合。Linq to object 也就是查询IEnumerable集合。...LINQ查询表达式最后是调用的链式查询方法,这些方法都是在静态类中定义好的,IEnumerable类型是直接的使用匿名方法调用执行,而IQueryable是使用人工解析的方式进行的,也就是自定义数据源
注意和前提 Linq是Linq to object 对于Linq to object,只有集合对象是 IEnumerable 时,才能命中到Linq里的lambda表达式,IQueryable是不行的。...对于Linq to object,当集合对象是 IEnumerable 时,是延迟执行的。只有结果被用到时,才会进行迭代。所以如果在实际执行前,集合数据发生改变会导致结果集和预期不符。...对于Linq to object,当集合对象是 IEnumerable 时,对单个对象进行迭代的方式是:先把单个对象走完所有的Linq方法后,直到最后或者执行到返回值不是IEnumerable的Linq...如果Linq方法的返回值不是IEnumerable,单个对象的迭代会到该方法(含)为止,会立即进行下一个对象的迭代。...操作 (断点操作) 勾上操作,会出现输入框和勾选框。 我们可以在输入框里输入一些字符串,字符串里可以使用变量/有返回值的方法,不过它们必须要放在 {} 里,会有智能提示的。
数据源 上例中,数据源是一个数组,因此它隐式支持泛型 IEnumerable 接口。 这一事实意味着该数据源可以用 LINQ 进行查询。...支持 IEnumerable 或派生接口(如泛型 IQueryable)的类型称为可查询类型。 可查询类型不需要进行修改或特殊处理就可以用作 LINQ 数据源。...下例中,Customers 表示数据库中的特定表,而查询结果的类型 IQueryable 派生自 IEnumerable。...查询还可以指定在返回这些信息之前如何对其进行排序、分组和结构化。 查询存储在查询变量中,并用查询表达式进行初始化。 为使编写查询的工作变得更加容易,C# 引入了新的查询语法。...Count、Max、Average 和 First 就属于此类查询。 由于查询本身必须使用 foreach 以便返回结果,因此这些查询在执行时不使用显式 foreach 语句。
固定大小,数组的大小是初始化时决定无法修改的数值。 2. 强类型,存储数据元素类型必须在初始化时指定,因此在运行时,不需要耗费额外的时间来定义数组类型,能够大大提升运行效率。 3....可使用Foreach关键字实现数组迭代和查找。 因为数组大小是固定的,且是强类型数据结构,因此在运行时只占用很少的内存,运行时效率很高。 ?...如果你无法判断代码改动的可能性,可以使用IList接口,减少模块之间的依赖性。IList是接口因此无法被实例化,所以必须使用List来初始化。...IEnumerable常用于遍历集合元素,但是无法修改(删除或添加)数据,使用IEnumberable 会从服务器端将所有数据拷贝到客户端,并进行一定的过滤,如果服务器端有大量数据会造成内存负载超重。...1: //Difference between IQueryable and IEnumerable 2: 3: //You can instantiate IEnumerable
名言警句 "理解IQueryable的最简单方式就是,把它看作一个查询,在执行的时候,将会生成结果序列。" - Jon Skeet LINQ to Object和LINQ to SQL有何区别?...Queryable是一个静态类型,它集合了许多扩展方法,扩展的目标是IQueryable和IEnumerable。它令IQueryable和IEnumerable一样,拥有强大的查询能力。...之后,在主程序的下一行,由于我们调用了ToList方法,此时必须要计算表达式了,故程序开始进行迭代,调用GetEnumerator方法,打印Begin to iterate,然后调用Execute方法,...IQueryable与 IEnumerable的异同? 首先IQueryable是解析一棵树,IEnumerable则是使用委托。...而使用IEnumerable,所有对于IEnumerable的过滤,排序等操作,都是在内存中发生的。也就是说数据已经从数据库中获取到了内存中,在内存中进行过滤和排序操作。
自己实现迭代器 yield的使用 怎样高性能的随机取IEnumerable中的值 我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件?...自己实现迭代器 .net中迭代器是通过IEnumerable和IEnumerator接口来实现的,今天我们也来依葫芦画瓢。 首先来看看这两个接口的定义: ? ? 并没有想象的那么复杂。...接下来开发画瓢,我们继承IEnumerable接口并实现: ? 下面使用原始的方式调用: ? 有朋友开始说了,我们平时都是通过foreache来取值的,没有这样使用过啊。...我们继续来看GetEnumerator的定义和调用: ? 我们调用GetEnumerator的时候,看似里面for循环了一次,其实这个时候没有做任何操作。...结束: demo下载:http://pan.baidu.com/s/1dE94c1b 接下篇:《再讲IQueryable,揭开表达式树的神秘面纱》
周末空闲,选读了一下一本很不错的C#语言使用的书,特此记载下便于对项目代码进行重构和优化时查看。...DTO类型为宜 在泛型接口上增加对应的传统接口 这个在大家基础架构时非常重要,每个方法均提供泛型版本和object版本,使得代码有很强的兼容性。...lock时,一定不要使用lock(this)和lock(typeof(MyType))的形式,这会造成很多的问题,必须保证锁的对象不是公开无法被外部使用的,常见的对方法加锁的形式有: 1.使用特性,[MethodImpl...区别IEnumerable和IQueryable的数据源 由于IQueryable数据源其实是对IEnumerable数据源的封装和增强,简答来说,IQueryable对象的相关数据处理操作的性能要远高于...IEnumerable对象,因而如果实际的返回值为IQueryable对象,那么不要经行相关的转化,当然也可以通过typeA as IQueryable来尝试转化,如果本来就是IQueryable对象则直接返回
如果使用 var,便无法为结果新建类。 请注意,在示例 #2 中,foreach 迭代变量 item 必须也为隐式类型。...int[] 数组 var a = new[] { 0, 1, 2 }; // expr 被编译成 IEnumerable 或者 IQueryable 类型 var...因此,如果使用 var 初始化了查询变量,则访问返回对象序列中的属性的唯一方法是在 foreach 语句中将 var 用作迭代变量的类型。...blueberry Uppercase: CHERRY, Lowercase: cherry */ 特别说明 以下限制适用于隐式类型化变量声明: 仅当局部变量在相同语句中进行声明和初始化时...只要你和必须维护你的代码的其他人了解这一点,使用隐式类型化实现便利性和简便性时便不会出现问题。 // 与前面的示例相同,只是我们使用整个姓氏作为键。
其实可以的,有个很隐蔽的窍门隐藏在IQueryable扩展方法对象Queryable中,也就是AsQueryable方法,它返回的是一个实现了IQueryable接口的EnumerableQuery...这样就可以消除IEnumerable、IQueryable这两个接口之间的动态查询瓶颈。...如果查询的数据对象是IEnumerable则会被动态编译成可以执行的委托然后直接执行,如果查询的是IQueryable则顺其自然的被提供程序解析执行。...很明显的例子就是当我们定义一个数据类型的对象时,无法再在后期运行时对它进行其他类型的使用,看一个简单的例子: 1 dynamic obj = 1;//整形 2 obj = "1";//字符串...后面我们就来详细的讲解如何扩展IQueryable、IQueryableProvider两个重量级接口,只有他们两个才能让我们和LINQ对话,这两个接口还是很神秘的。
known ToString(), processed like this: 我们可以得出结论,根本就没有教导提供者如何处理这些情况,但是可以教导它如何将这些情况与众所周知的ToString()进行处理...method参数是MethodCallExpression类型,包含有关方法本身和提供给它的参数的信息。 ...因此,我们将在VisitMethodCall方法中关注该列表,直到第一个肯定的FilterPredicate为止,然后转换参数( SelectorArgumentFunc )并执行ReturnFunc...请注意转换在IQueryable 中具有IQueryable方法的qu.Provider.CreateQuery(result) 。 它广泛用于C#(请看IEnumerable 接口!)...,它来自使用一个要获取IQueryable / IEnumerable的类处理所有通用接口并使用通用接口方法进行处理的需要。