我很困惑因为在的差异。是相当新的。净的,我知道我可以查询 IEnumerables 使用皇宫的扩展。这是什么 IQueryable 及它是如何不同?


也参看 之间的区别是什么IQueryable[T]和类型[T]? 重叠与这个问题。

有帮助吗?

解决方案

IEnumerable<T> 表示只进的光标 T..净3.5加入扩展方法,其中包括 LINQ standard query operators 喜欢 WhereFirst, 任何经营者需要谓的或匿名的功能把 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 将执行的方法一旦为每一个人, yielding价值观的方法返回 true.

在第二块, x => x.Age > 18 是一个表达树(Expression<Func<Person, bool>>),这可以被认为是"是的"年龄"的财产>18".

这让事情像皇宫-对-SQL存在,因为他们可以分析所表达的树木并将其转换成等同的SQL。和因为提供者不需要到执行,直到的 IQueryable 是列举(它实现 IEnumerable<T>, 之后,所有),它可以将多个查询的运营商(在上面的例子 WhereFirstOrDefault)要做出更明智的选择如何执行整个查询对基础数据来源(如使用 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查询与所有过滤器。因此,做更少的工作和变快。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top