写在msdn上:
返回类型为 的输入
IEnumerable<T>
。
我不明白。帮助我理解这种方法。
有三种实现方式AsEnumerable
。
DataTableExtensions.AsEnumerable
扩展 aDataTable
给它一个IEnumerable
接口,这样你就可以对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 提供程序,例如 Entity Framework,我这样做,
sequence.Where(x => SomeUnusualPredicate(x));
该查询将在服务器上编写和运行。这将在运行时失败,因为 Entity Framework 不知道如何转换SomeUnusualPredicate
为 SQL。
如果我希望它改为使用 Linq to Objects 运行语句,我会这样做,
sequence.AsEnumerable().Where(x => SomeUnusualPredicate(x));
现在服务器将返回所有数据,并且将Enumerable.Where
使用从 Linq 到对象的方法,而不是使用查询提供程序的实现。
Entity Framework不知道怎么解释没关系SomeUnusualPredicate
,我的函数会直接使用。(但是,这可能是一种低效的方法,因为所有行都将从服务器返回。)