Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 理解Linq中的可计算对象_C#_Asenumerable - Fatal编程技术网

C# 理解Linq中的可计算对象

C# 理解Linq中的可计算对象,c#,asenumerable,C#,Asenumerable,写在msdn上: 返回键入为IEnumerable的输入 我不明白。 帮助我理解这个方法。有三种可计算的实现 扩展DataTable以给它一个IEnumerable接口,这样就可以对DataTable使用Linq 和 AsEnumerable(IEnumerable)方法无效 而不是将源代码的编译时类型从 将IEnumerable实现为IEnumerable本身 AsEnumerable(IEnumerable)可用于选择 序列实现时在查询实现之间 IEnumerable但也有一组不同的公共查

写在msdn上:

返回键入为
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));