Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.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
.net Linq查询未返回IEnumerable_.net_Vb.net_Linq - Fatal编程技术网

.net Linq查询未返回IEnumerable

.net Linq查询未返回IEnumerable,.net,vb.net,linq,.net,Vb.net,Linq,我在从.NET 1.1转换为3.5的web应用程序中有以下Linq查询: dim objListOfFilteredDataRows = from datarows as datarow in objDataSet.tables(0).rows _ where datarows("SomeColumn") = SomeValue 我在使用.NET3.5创建的应用程序中有完全相同的查询,该查询返回IEnumerable。但是,转换后

我在从.NET 1.1转换为3.5的web应用程序中有以下Linq查询:

dim objListOfFilteredDataRows = from datarows as datarow in objDataSet.tables(0).rows _
                                where datarows("SomeColumn") = SomeValue
我在使用.NET3.5创建的应用程序中有完全相同的查询,该查询返回IEnumerable。但是,转换后的应用程序中的查询将返回:

{Name = "WhereEnumerableIterator`1" FullName = "System.Linq.Enumerable+WhereEnumerableIterator`1[[System.Data.DataRow, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"}
**编辑: 当我突出显示表达式时,intellisense表示它不知道ObjListoffieltedDataRows的类型,并假定它是“Object”类型

为什么在转换后的1.1应用程序中没有推断出类型,而在“本机”3.5中推断出类型**


我错过了什么?如何将“WhereEnumeratorIterator`1转换为IEnumerable?谢谢!

类型
WhereEnumerator1
是一个生成的类,它本身实现了
IEnumerable(Of T)
。它实际上是将C迭代器编译成System.Core.dll的结果


不需要进行转换,因为您从未在代码中实际看到
WhereEnumerator1
类型,因为它是System.Core.Dll的私有类型。相反,您只看到查询的返回类型,在本例中,它将是
IEnumerable(of T)

,您可以调用
AsEnumerable()如果您需要将对象显式地作为
IEnumerable
(例如,如果您需要混合使用LINQ到SQL和LINQ到对象),则在查询本身上使用扩展方法

举个例子,它是:

dim objListOfFilteredDataRows = (from datarows as datarow in objDataSet.tables(0).rows _
                                where datarows("SomeColumn") = SomeValue).AsEnumerable()

如果您所需要的只是实现
IEnumerable
,那么查询本身应该可以工作;您遇到问题了吗?

不,您确实得到了IEnumerable。它只是碰巧由System.Linq.Enumerable命名空间内的一个类实现,一个私有类。这是不可避免的,无法创建实例接口的ce。不要让调试器信息使您走上错误的轨道。

请检查此文件中是否有System.Linq命名空间

我找到了有关.NET项目设置更改的详细说明,这些更改在将项目从早期版本的.NET转换为3.5时必须更新,以便项目和编译器支持Linq和与使用泛型相关的类型推断功能。在项目设置中,在“编译”选项卡下,“选项推断”必须设置为“开”。这将允许编译器推断由任何“dim someobject=[some expression]创建的“someobject”的类型“这就是为什么在使用调试器时,我看不到预期的IEnumerable或无法使用该接口的任何关联成员和属性。因为Linq查询所在的项目是一个原始的3.5应用程序,“Option Infert”设置在默认情况下处于启用状态。

感谢您提供的示例。对于转换后的应用程序为什么不推断查询生成的类型,您有什么意见吗?我已经导入了名称空间。转换后的1.1应用程序中未推断该类型。很抱歉。我很确定你的问题更复杂,你是因为这个原因在某个地方出现了实际的错误,还是被调试器弄糊涂了?看起来一切都很好(因为,正如下面所说,
WhereEnumerableIterator
实现了
IEnumerable
)。如果您遇到类型转换问题,让我们看看发生该问题的代码。我找到了解决方案!项目设置的“编译”部分下的“推断”选项已关闭。这是因为该项目正在从早期版本转换为3.5版本的.NET。您应该将此添加为答案,并接受您的答案作为解决方案。太棒了!由于MSDN和StackOverflow,我刚刚遇到了同样的问题,并在大约一分钟内修复了它。