2010-01-22 92 views
4

我有跟隨的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

回答

3

我發現this的必須爲了從.NET的早期版本轉換項目3.5時更新.NET項目的設置更改的詳細的解釋用於項目和編譯器以支持Linq和與使用泛型相關的類型推斷功能。在項目設置的「編譯」選項卡下,「選項推斷」必須設置爲「開」。這將允許編譯器推斷任何「dim someobject = [some expression]」創建的「someobject」的類型「這就是爲什麼當我使用調試器時,我沒有看到預期的IEnumerable或能夠使用任何接口的關聯的成員和屬性。由於Linq查詢所在的項目是原始3.5應用程序,因此默認情況下「選項推斷」設置處於打開狀態。

+0

輝煌!我剛剛遇到了同樣的問題,並在一分鐘內修復了MSDN和StackOverflow。 – 2010-11-12 12:32:02

4

類型WhereEnumeratorIterator1是自身實現IEnumerable(Of T)生成的類,它實際上是編譯C#迭代器System.Core.dll的結果。

沒有轉換是必要的,因爲你從來沒有真正看到你的代碼中WhereEnumeratorIterator1類型,因爲它是私有System.Core.Dll。相反,你只看到查詢的返回類型,在這種情況下,將IEnumerable(Of T)

1

你如果您明確需要該對象作爲,則可以在查詢本身上調用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

5

不,你確實得到了IEnumerable。它恰好是由System.Linq.Enumerable命名空間(一個私有類)內的類實現的。這是不可避免的,沒有辦法創建一個接口的實例。不要讓調試器信息將您置於錯誤的軌道上。

0

請檢查是否有System.Linq的命名空間在這個文件

+0

我已經導入了命名空間。該類型不是在轉換後的1.1版應用程序中傳播的。 – Achilles 2010-01-22 16:37:48

+0

對不起。我很確定你的問題更復雜 – st78 2010-01-22 16:39:25