C# 理解Linq中的可计算对象
写在msdn上: 返回键入为C# 理解Linq中的可计算对象,c#,asenumerable,C#,Asenumerable,写在msdn上: 返回键入为IEnumerable的输入 我不明白。 帮助我理解这个方法。有三种可计算的实现 扩展DataTable以给它一个IEnumerable接口,这样就可以对DataTable使用Linq 和 AsEnumerable(IEnumerable)方法无效 而不是将源代码的编译时类型从 将IEnumerable实现为IEnumerable本身 AsEnumerable(IEnumerable)可用于选择 序列实现时在查询实现之间 IEnumerable但也有一组不同的公共查
IEnumerable
的输入
我不明白。
帮助我理解这个方法。有三种可计算的
实现
扩展DataTable
以给它一个IEnumerable
接口,这样就可以对DataTable
使用Linq
和
AsEnumerable(IEnumerable)
方法无效
而不是将源代码的编译时类型从
将IEnumerable
实现为IEnumerable
本身
AsEnumerable(IEnumerable)
可用于选择
序列实现时在查询实现之间
IEnumerable
但也有一组不同的公共查询方法
可用。例如,给定一个实现
IEnumerable
,并有自己的方法,如Where
,选择
,和
SelectMany
,调用Where
将调用公共Where
方法
表格
。表示数据库表的表
类型可能具有
其中
将谓词参数作为表达式树的方法
并将树转换为SQL以便远程执行。如果远程执行
不需要,例如,因为谓词调用本地
方法,则可以使用AsEnumerable
方法隐藏
自定义方法,改为使用标准查询运算符
可用
换句话说。
如果我有
IQueryable<X> sequence = ...;
该查询将在服务器上合成并运行。这将在运行时失败,因为实体框架不知道如何将SomeUnusualPredicate
转换为SQL
如果我想用Linq to对象来运行语句,我会
sequence.AsEnumerable().Where(x => SomeUnusualPredicate(x));
现在,服务器将返回所有数据和可枚举项。其中将使用从Linq到对象的,而不是查询提供程序的实现
实体框架不知道如何解释一些异常预测,这无关紧要,我的函数将直接使用。(然而,这可能是一种低效的方法,因为所有的行都将从服务器返回。)Jon Skeet在Linq to对象上做了一系列出色的工作。这里有一个很好的解释:@Jodrell抱歉,我已经通过同意然后改变主意来抹去你的选票;这不是我的本意。@Rawling,看来我无法恢复我的投票:-S。没关系。这里有一个简单(也许不是那么典型)的例子:List li=XXX;var reversedWithLinq=li.AsEnumerable().Reverse()代码>。AsEnumerable
的含义是“隐藏”由实际类型或接口定义的其他重载,而不是IEnumerable
,以确保使用的重载是来自IEnumerable
扩展的重载。如果从我的示例中删除.AsEnumerable()
,它将不会编译,因为另一个方法返回void
。
sequence.AsEnumerable().Where(x => SomeUnusualPredicate(x));