写在msdn:
返回输入为
IEnumerable<T>
的输入。
我不明白。 帮助我理解这种方法。
答案 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>
并拥有自己的方法,例如Where
,Select
和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
并不重要,我的功能将直接使用。 (但是,这可能是一种效率低下的方法,因为所有行都将从服务器返回。)