IQueryable<T>和IEnumerable<T>之间的区别是什么?


另见IQueryable和IEnumerable之间的区别是什么,与这个问题重叠。


当前回答

主要的区别是IQueryable<T>的LINQ操作符接受表达式对象而不是委托,这意味着它接收的自定义查询逻辑,例如,谓词或值选择器,是表达式树的形式,而不是方法的委托。

IEnumerable<T>非常适合处理在内存中迭代的序列,但是 IQueryable<T>允许内存不足的事情,如远程数据源,如数据库或web服务。

查询执行:

查询的执行将在“进程中”执行,通常所需要的只是执行查询的每个部分的代码(作为代码)。 在将在进程外执行的地方,查询的逻辑必须用数据表示,以便LINQ提供程序可以将其转换为内存外执行的适当形式——无论是LDAP查询、SQL查询还是其他查询。

更多:

LINQ: IEnumerable<T> and IQueryable<T> c# 3.0和LINQ。 返回IEnumerable<T> vs IQueryable<T> 面向。net和c#开发人员的响应式编程——IEnumerable, IQueryable, IObservable和iqobservable的介绍 2008年:巴特·德·斯梅特的“年度最有趣的界面…可查询<T>”。

其他回答

主要的区别是IQueryable<T>的LINQ操作符接受表达式对象而不是委托,这意味着它接收的自定义查询逻辑,例如,谓词或值选择器,是表达式树的形式,而不是方法的委托。

IEnumerable<T>非常适合处理在内存中迭代的序列,但是 IQueryable<T>允许内存不足的事情,如远程数据源,如数据库或web服务。

查询执行:

查询的执行将在“进程中”执行,通常所需要的只是执行查询的每个部分的代码(作为代码)。 在将在进程外执行的地方,查询的逻辑必须用数据表示,以便LINQ提供程序可以将其转换为内存外执行的适当形式——无论是LDAP查询、SQL查询还是其他查询。

更多:

LINQ: IEnumerable<T> and IQueryable<T> c# 3.0和LINQ。 返回IEnumerable<T> vs IQueryable<T> 面向。net和c#开发人员的响应式编程——IEnumerable, IQueryable, IObservable和iqobservable的介绍 2008年:巴特·德·斯梅特的“年度最有趣的界面…可查询<T>”。

简单地说,另一个主要的区别是IEnumerable在服务器端执行select查询,在客户端加载内存中的数据,然后过滤数据,而IQueryable在服务器端执行select查询,使用所有过滤器。

IEnumerable引用了一个集合,而IQueryable只是一个查询,它将在表达式树中生成。我们将运行这个查询从数据库中获取数据。

Ienumerable:当我们想处理进程内内存时,即没有数据连接 可查询:何时处理SQL server,即数据连接 Ilist:添加对象、删除对象等操作

首先,IQueryable<T>扩展了IEnumerable<T>接口,所以任何你可以用“普通”IEnumerable<T>做的事情,你也可以用IQueryable<T>做。

IEnumerable<T>只有一个GetEnumerator()方法,该方法返回一个Enumerator<T>,为此您可以调用它的MoveNext()方法来遍历T的序列。

IQueryable<T>具有而IEnumerable<T>所没有的两个特殊属性——一个指向查询提供程序(例如,LINQ to SQL提供程序),另一个指向表示IQueryable<T>对象的查询表达式,作为一个运行时可遍历的抽象语法树,可以被给定的查询提供程序理解(在大多数情况下,你不能在不抛出异常的情况下将LINQ to SQL表达式提供给LINQ to Entities提供程序)。

表达式可以是对象本身的常量表达式,也可以是由查询操作符和操作数组成的更复杂的树。查询提供程序的IQueryProvider.Execute()或IQueryProvider.CreateQuery()方法通过传递给它的表达式被调用,然后分别返回一个查询结果或另一个IQueryable方法。