之间有什么区别IQueryable和类型
-
19-09-2019 - |
题
我很困惑因为在的差异。是相当新的。净的,我知道我可以查询 IEnumerables
使用皇宫的扩展。这是什么 IQueryable
及它是如何不同?
也参看 之间的区别是什么IQueryable[T]和类型[T]? 重叠与这个问题。
解决方案
IEnumerable<T>
表示只进的光标 T
..净3.5加入扩展方法,其中包括 LINQ standard query operators
喜欢 Where
和 First
, 任何经营者需要谓的或匿名的功能把 Func<T>
.
IQueryable<T>
实现同一个皇宫的标准查询经营者,但接受 Expression<Func<T>>
为谓的和匿名的功能。 Expression<T>
是一个汇编的表达树,一个破碎的方法("半汇编"如果你愿),可以分析的可查询的提供者和使用相应。
例如:
IEnumerable<Person> people = GetEnumerablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();
IQueryable<Person> people = GetQueryablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();
在第一块, x => x.Age > 18
是一个匿名的方法(Func<Person, bool>
),这可以执行的像任何其他方法。 Enumerable.Where
将执行的方法一旦为每一个人, yield
ing价值观的方法返回 true
.
在第二块, x => x.Age > 18
是一个表达树(Expression<Func<Person, bool>>
),这可以被认为是"是的"年龄"的财产>18".
这让事情像皇宫-对-SQL存在,因为他们可以分析所表达的树木并将其转换成等同的SQL。和因为提供者不需要到执行,直到的 IQueryable
是列举(它实现 IEnumerable<T>
, 之后,所有),它可以将多个查询的运营商(在上面的例子 Where
和 FirstOrDefault
)要做出更明智的选择如何执行整个查询对基础数据来源(如使用 SELECT TOP 1
在SQL)。
参见:
其他提示
在现实生活中,如果使用一个奥姆像皇宫-对-SQL
- 如果创建一个
IQueryable
, 然后查询可能被转换成sql和运行数据库服务器上 - 如果创建一个
IEnumerable
, 然后所有行将被拉入存储器作为目前运行查询。
在这两种情况下,如果你不呼叫一个 ToList()
或 ToArray()
然后查询将要执行的每次被使用,因此,比如说,你有一个 IQueryable
和你填补4个列表框,则查询将对数据库运行4次。
还有如果你延长你的查询:
q.Select(x.name = "a").ToList()
然后再用一个 IQueryable
所产生的SQL将包含 where name = "a"
, 但有一个 IEnumerable
许多更多的角色,将被拉回的数据库,然后了 x.name = "a"
检查将会完成。网。
“的主要区别在于,对于IQueryable的定义的扩展方法采取表达对象,而不是函数功能对象,这意味着其接收到的代表是表达式树,而不是调用方法。IEnumerable的非常适合在内存中的集合工作,但IQueryable的允许远程数据源,如一个数据库或Web服务“
来源:此处
<强>的IEnumerable 强> IEnumerable的是最适合在内存中收集。 IEnumerable的不项之间移动时,它是只向前集合。
<强>的IQueryable 强> IQueryable的远程数据源最适合,如数据库或Web服务。 IQueryable的是一个非常强大的功能,使各种有趣的延迟执行场景(如传呼和组合物基于查询)。
所以,当你要简单地通过内存访问集合,使用IEnumerable的,如果你需要做像数据集和其他数据源收集任何操作,使用IQueryable的
的原则性差别在于,将IEnumerable的所有元素的枚举所有的时间,而将IQueryable的基于查询枚举元素,或者甚至做其他事情,。该查询是表达式(的Net代码数据表示),其中IQueryProvider必须探索/解释/编译/不管以产生结果。
有一个查询表达式给出了两个优点。
第一个优点是优化。因为像修饰“其中”包括在查询表达式中,IQueryProvider可以申请,否则是不可能的优化。而不是返回的所有元素,然后扔他们大多远离因“凡”条款,供应商可以使用一个哈希表来定位与给定的关键项目。
在第二个优点是灵活性。因为表达式是探索的数据结构,则可以执行诸如序列化查询并将其发送到远程机器(例如,LINQ到SQL)。
IQueriable相同IEnumerable的,但它也提供了额外的功能,以实现自定义的LINQ查询。这里是MSDN描述: http://msdn.microsoft。 COM / EN-US /库/ system.linq.iqueryable.aspx
首先IEnumerable的在一个System.Collections命名空间发现而IQueryable的在一个System.Linq的命名空间中。如果从内存中集合一样列表,数组集合查询等数据时,查询出来,从内存中的数据时(比如远程数据库,服务)集合是使用了IEnumerable,所以你使用IQueryable的。因为虽然查询从数据库中的数据,IEnumerable的内存在客户端在服务器端执行选择查询,负载数据,然后过滤数据。因此,做更多的工作,变得缓慢。虽然从查询数据库中的数据,IQueryable的服务器端执行select查询与所有过滤器。因此,做更少的工作和变快。