我在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?谢谢!
答案 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命名空间