了解Linq中对象的AsEnumerable

时间:2014-05-19 08:50:34

标签: c# asenumerable

写在msdn:

  

返回输入为IEnumerable<T>的输入。

我不明白。 帮助我理解这种方法。

1 个答案:

答案 0 :(得分:1)

AsEnumerable有三种实现。

<强> DataTableExtensions.AsEnumerable

扩展DataTable以提供IEnumerable界面,以便您可以将Linq用于DataTable

Enumerable.AsEnumerable<TSource>ParallelEnumerable.AsEnumerable<TSource>

  

AsEnumerable<TSource>(IEnumerable<TSource>)方法无效   除了从类型更改源代码的编译时类型   实现IEnumerable<T>IEnumerable<T>本身。

     

AsEnumerable<TSource>(IEnumerable<TSource>)可用于选择   在序列实现时的查询实现之间   IEnumerable<T>但也有一组不同的公共查询方法   可用。例如,给定实现的泛型类Table   IEnumerable<T>并拥有自己的方法,例如WhereSelect和   SelectMany,对Where的调用会调用公共Where方法   Table。表示数据库表的Table类型可以具有   将谓词参数作为表达式树的Where方法   并将树转换为SQL以进行远程执行。如果远程执行   不需要,例如因为谓词调用本地   方法,AsEnumerable<TSource>方法可用于隐藏   自定义方法,而是制作标准查询运算符   可用。

换句话说。

如果我有

IQueryable<X> sequence = ...;
来自Linq提供商的

,如实体框架,我做,

sequence.Where(x => SomeUnusualPredicate(x));

该查询将在服务器上编写并在其上运行。这将在运行时失败,因为实体框架不知道如何将SomeUnusualPredicate转换为SQL。

如果我希望用Linq to Objects运行语句,我会这样做,

sequence.AsEnumerable().Where(x => SomeUnusualPredicate(x));

现在服务器将返回所有数据,并且将使用从Linq到Objects的Enumerable.Where而不是查询提供程序的实现。

实体框架不知道如何解释SomeUnusualPredicate并不重要,我的功能将直接使用。 (但是,这可能是一种效率低下的方法,因为所有行都将从服务器返回。)