代码之家  ›  专栏  ›  技术社区  ›  Achilles

Linq查询未返回IEnumerable

  •  4
  • Achilles  · 技术社区  · 15 年前

    我有以下Linq查询,它位于从.NET 1.1转换为3.5的Web应用程序中:

    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的类型,并假定它是“对象”类型。

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

    我这里缺什么?如何将“WhereEnumerator`1”转换为IEnumerable?谢谢!

    5 回复  |  直到 15 年前
        1
  •  5
  •   Hans Passant    15 年前

    不,你真的得到了一个IEnumerable。它恰好由System.Linq.Enumerable命名空间(私有类)内的类实现。这是不可避免的,无法创建接口的实例。不要让调试器信息把你放在错误的轨道上。

        2
  •  4
  •   JaredPar    15 年前

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

    不需要转换,因为您从未真正看到 其中枚举器1 输入代码,因为它是System.Core.dll的私有代码。相反,您只看到查询的返回类型,在本例中 IEnumerable(共T) .

        3
  •  3
  •   Achilles    15 年前

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

        4
  •  1
  •   Adam Robinson    15 年前

    你可以打电话给 AsEnumerable() 如果需要将对象显式作为 IEnumerable<T> (例如,如果需要混合linq to sql和linq to对象)。

    对于您的示例,它将是:

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

    如果你所需要的只是实现 IEnumerable<t> ,则查询本身应该可以工作;您是否遇到问题?

        5
  •  0
  •   st78    15 年前

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