Linq Query不返回IEnumerable

时间:2010-01-22 16:21:07

标签: .net vb.net linq

我在Web应用程序中跟随Linq查询,该查询从.NET 1.1转换为3.5:

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

我在使用.NET 3.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表示它不知道objListOfFilteredDataRows的类型并假定它的类型为“Object”。

为什么在转换后的1.1应用程序中没有输入类型但是在“原生”3.5中输入?**

我在这里缺少什么?如何将“WhereEnumeratorIterator`1转换为IEnumerable?谢谢!

5 个答案:

答案 0 :(得分:5)

不,你确实得到了IEnumerable。它恰好由System.Linq.Enumerable命名空间内的一个类实现,这是一个私有类。这是不可避免的,没有办法创建一个接口的实例。不要让调试器信息让你走错了路。

答案 1 :(得分:4)

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

不需要进行转换,因为您实际上从未在代码中看到WhereEnumeratorIterator1类型,因为它是System.Core.Dll专用的。相反,您只能看到查询的返回类型,在这种情况下将是IEnumerable(Of T)

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

对于您的示例,它将是:

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

如果您只需要实现IEnumerable<T>,那么查询本身应该可行;你遇到了问题吗?

答案 4 :(得分:0)

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