理解对象关联中的AsEnumerable
本文关键字:AsEnumerable 关联 对象 | 更新日期: 2023-09-27 18:04:12
msdn:
返回类型为
IEnumerable<T>
的输入。
我不明白。
AsEnumerable
有三种实现方式。
DataTableExtensions.AsEnumerable
扩展一个DataTable
,给它一个IEnumerable
接口,这样你就可以对DataTable
使用Linq。
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));
现在服务器将返回所有的数据和Enumerable.Where
从Linq到对象将被使用,而不是查询提供程序的实现。
没关系,实体框架不知道如何解释SomeUnusualPredicate
,我的函数将直接使用。(但是,这可能是一种低效的方法,因为所有的行都将从服务器返回。)