2017-10-10 78 views
0

派生我發現,這是不可能直接使用LINQ超過IEnumerable<T>System.Data.DataRowCollection爲什麼不能在DataRowCollection使用LINQ如果其基類自IEnumerable <T>

這來自類別System.Data.InternalDataCollectionBase它實現IEnumerable<T>派生一個實例,所以它可以通過使用LINQ函數完全有意義,但是我不能。

檢查下面的例子:

using (DBConnection connExport = DBConnection.OpenConnection()) 
{ 
    DataTable dt = GetDataTableFromDatabase(); 

    DataRow dr1 = dt.Rows.First(); // This LINQ is not allowed 
    foreach(DataRow dr in dt.Rows) // But enumerating it works fine 
    { 
      // Some processing... 
    } 
} 

我已搜查的official docs of LINQ,我發現

標準查詢操作符允許查詢被應用到任何基於可枚舉信息源。

我知道原因應該是非常簡單的事情,但我不知道它是什麼。所以我在這裏:

爲什麼LINQ對於System.Data.DataRowCollection實例不允許?

[編輯]:已經有一個如何克服這一點,但不是到爲什麼一個答案,所以這是我的目的,這一點:明白了,不克服。

+0

沒有答案,但_dt.AsEnumerable()FirstOrDefault()_將允許您使用LINQ上。 DataTable – Steve

+4

它不是'IEnumerable '。它只是'System.Collections.IEnumerable'。 –

+0

根據您的編輯,您也在尋找*爲什麼不能使用LINQ *請檢查@EdPlunkett評論以瞭解爲什麼您不能使用LINQ。只是因爲它不是'IEnumerable ',我已經在我的回答中提到了。 –

回答

0

這是System.Collections.IEnumerable類型的不IEnumerable<T>但你可以使用CastOfType在這裏使用LINQ:

DataRow dr1 = dt.Rows.Cast<DataRow>().First(); 
+0

作爲替代方案,您可以包含'System.Data.DataSetExtensions.dll',然後只需執行'dt.AsEnumerable()。First()' –

相關問題