理解对象关联中的AsEnumerable

本文关键字:AsEnumerable 关联 对象 | 更新日期: 2023-09-27 18:04:12

msdn:

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

我不明白。

理解对象关联中的AsEnumerable

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,我的函数将直接使用。(但是,这可能是一种低效的方法,因为所有的行都将从服务器返回。)