LINQ查询没有返回的IEnumerable

问题描述:

我有跟随的LINQ查询是在web应用中这是从.NET 1.1转换为3.5:LINQ查询没有返回的IEnumerable

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]]"} 

**编辑: 当我突出表现,智能感知说,它不知道objListOfFilteredDataRows的类型,并承担一种“对象” 。

为什么不类型的转换1.1应用程序infered但infered在“本地” 3.5?**

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

+0

您是因为这个而在某个地方收到实际的错误,或者只是被调试器弄糊涂了?它看起来好像一切都很好(因为,正如以下所述,“WhereEnumerableIterator '执行'IEnumerable ')。如果您遇到类型转换问题,请让我们看看代码出现问题的位置。 – bdukes 2010-01-22 16:46:07

+2

我找到了解决方案!项目设置的“编译”部分下的选项推断被关闭。这是因为该项目正在从早期版本转换为.NET的版本号为 – Achilles 2010-01-22 17:06:55

+0

。您应该添加此答案并接受您的答案作为解决方案。 – 2010-01-22 19:18:12

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

+0

辉煌!我刚刚遇到了同样的问题,并在一分钟内修复了MSDN和*。 – 2010-11-12 12:32:02

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

没有转换是必要的,因为你从来没有真正看到你的代码中WhereEnumeratorIterator1类型,因为它是私有System.Core.Dll。相反,你只看到查询的返回类型,在这种情况下,将IEnumerable(Of T)

你如果您明确需要该对象作为,则可以在查询本身上调用AsEnumerable()扩展方法(例如,如果需要混合使用LINQ-to-SQL和LINQ-to-Objects,例如)。

对于你的榜样,那就是:

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

如果你需要的是什么,实现IEnumerable<T>,然后查询本身应该工作;你遇到问题了吗?

+0

我可以得到一个代码示例吗? – Achilles 2010-01-22 16:29:24

+0

感谢您的示例。你对转换后的应用程序为什么不推断查询生成的类型有任何意见吗? – Achilles 2010-01-22 16:33:39

+0

为什么downvote? – 2010-01-22 16:45:02

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

请检查是否有System.Linq的命名空间在这个文件

+0

我已经导入了命名空间。该类型不是在转换后的1.1版应用程序中传播的。 – Achilles 2010-01-22 16:37:48

+0

对不起。我很确定你的问题更复杂 – st78 2010-01-22 16:39:25