2013-05-29 33 views
2

這個問題是鑄造的「LINQ與Data.DataTableCollection鑄造」連續的問題,這裏是鏈接[問題] LINQ casting with a Data.DataTableCollection @Lasse Espeholt爲什麼LINQ與Data.DataTableCollection

我情況相同的情況。我想對集合DataTableCollection執行LINQ查詢。但是,如果我寫下如下代碼:

from dataTable in dataSet.Tables 

在Visual Studio將報告錯誤「找不到源類型‘System.Data.DataTableCollection’的查詢模式的實現」。所以解決方法是將代碼更改爲以下內容:

因此,我從互聯網挖掘根本原因。我發現了一些線索:「典型的LINQ to Objects查詢表達式不僅需要實現IEnumerable作爲其數據源的類,還會返回相同類型的實例。」在this page。所以我不知道DataTableCollection不會繼承接口IEnumerable。但根據我在MSDN檢查,我發現DataTableCollection中的的傳承關係如下:

DataTableCollection 
    InternalDataCollectionBase 
     ICollection 
      IEnumerable 

所以這個的傳承關係,意味着只有DataTableCollection中繼承IEnumerable接口,不繼承IEnumerable接口。所以它不能支持LINQ查詢。並且解決方案是使用cast方法將其轉換爲IEnumerable,然後可以執行LINQ查詢。

因此,作爲想要啓用LINQ功能對象的類的摘要,它必須繼承IEnumerable接口和IEnumerable接口。

我的摘要正確嗎? IEnumerable和IEnumerable有什麼區別?

+0

你的意思了IEnumerable 和IEnumerable之間的差異? –

+0

是的,@Rahul。我不知道IEnumerable 和IEnumerable之間沒有任何區別,除了泛型接口。 – newcarcrazy

回答

6

這裏的問題是DataTableCollection沒有實現通用的IEnumerable<T>接口。該接口隨.NET 2.0一起添加,並從早期出現的非泛型IEnumerable接口繼承。 LINQ查詢需要這個通用接口,並且不適用於非通用版本。

DataTableCollection是2.0以前的版本,而在.NET 2.0中添加了通用的IEnumerable<T>

雖然微軟可能已經在existig框架類型中添加了這個通用接口,但我的猜測是他們並不是因爲時間限制,風險和有限的用處。

有很多舊的類可以從這個通用接口中受益(並且它有時非常煩人,他們缺乏該接口),但是添加這個需要花費大量時間來實現和測試向後兼容性。改變現有的東西包括破壞現有應用程序的風險。 .NET設計師對引入重大變化非常保守。

所以我認爲他們計算出高於好處的成本,因爲那些舊的類型在未來的新工具的可用性中不會被使用太多。此外,還有一個簡單的解決方法,就是您已經找到的Enumerable.Cast<T>(Enumerable)擴展方法。

C#LINQ語言實現甚至對此Cast<T>方法具有內置支持;它可以按如下方式寫入:

from DataTable dataTable in dataSet.Tables 

其中在幕後翻譯爲:

from dataTable in dataSet.Tables.Cast<DataTable>() 
+0

謝謝! @Steven,你最近更新的是我想問你的問題。根據你的解釋,語法是「從dataTable dataTable中的DataTable數據表」,所以在這裏看起來類型「DataTable」不是變量dataTable的聲明,它是泛型類型的聲明。我的理解正確嗎? – newcarcrazy

+0

我不確定你的意思。 – Steven

+0

你好,@Steven,藉口讓你混淆。乍看之下,我忽略了「C#LINQ語言實現甚至內置了對這種Cast的支持」方法;「,所以我想知道第一種類型代碼的語法定義。現在,我知道也許在編譯之後,第一種類型的代碼可以轉換爲第二種類型的代碼。再次感謝您的解釋。 – newcarcrazy