數據表上的LINQ查詢

我試圖對DataTable對象執行LINQ查詢,但奇怪的是,我發現對DataTables執行此類查詢並不簡單。 例如: 安全

var results = from myRow in myDataTable
where results.Field("RowNo") == 1
select results;

這是不容許的。 如何得到相似的效果? ui

我很驚訝在數據表上不容許使用LINQ查詢! spa


#1樓

嘗試這個code

var row = (from result in dt.AsEnumerable().OrderBy( result => Guid.NewGuid()) select result).Take(3) ;

#2樓

這並非故意禁止在DataTables上使用它們,只是DataTables早於能夠在其上執行Linq查詢的IQueryable和通用IEnumerable結構。 對象

這兩個接口都須要某種類型安全性驗證。 數據表不是強類型的。 例如,這就是爲何人們沒法針對ArrayList進行查詢的相同緣由。 接口

爲了使Linq正常工做,您須要針對類型安全的對象映射結果,而後針對該對象進行查詢。 get


#3樓

您能夠使用LINQ來處理Rows集合上的對象,以下所示: it

var results = from myRow in myDataTable.Rows where myRow.Field("RowNo") == 1 select myRow;

#4樓

正如@ ch00k所說: io

using System.Data; //needed for the extension methods to work

...

var results = 
    from myRow in myDataTable.Rows 
    where myRow.Field<int>("RowNo") == 1 
    select myRow; //select the thing you want, not the collection

您還須要添加對System.Data.DataSetExtensions的項目引用 擴展


#5樓

您沒法查詢DataTableRows集合,由於DataRowCollection沒有實現IEnumerable<T> 。 您須要爲DataTable使用AsEnumerable()擴展。 像這樣:

var results = from myRow in myDataTable.AsEnumerable()
where myRow.Field<int>("RowNo") == 1
select myRow;

正如Keith所說,您須要添加對System.Data.DataSetExtensions的引用

AsEnumerable()返回IEnumerable<DataRow> 。 若是須要將IEnumerable<DataRow>轉換爲DataTable ,請使用CopyToDataTable()擴展名。

如下是Lambda表達式查詢,

var result = myDataTable
    .AsEnumerable()
    .Where(myRow => myRow.Field<int>("RowNo") == 1);
相關文章
相關標籤/搜索