我試圖對DataTable對象執行LINQ查詢,但奇怪的是,我發現對DataTables執行此類查詢並不簡單。 例如: 安全
var results = from myRow in myDataTable where results.Field("RowNo") == 1 select results;
這是不容許的。 如何得到相似的效果? ui
我很驚訝在數據表上不容許使用LINQ查詢! spa
嘗試這個code
var row = (from result in dt.AsEnumerable().OrderBy( result => Guid.NewGuid()) select result).Take(3) ;
這並非故意禁止在DataTables上使用它們,只是DataTables早於能夠在其上執行Linq查詢的IQueryable和通用IEnumerable結構。 對象
這兩個接口都須要某種類型安全性驗證。 數據表不是強類型的。 例如,這就是爲何人們沒法針對ArrayList進行查詢的相同緣由。 接口
爲了使Linq正常工做,您須要針對類型安全的對象映射結果,而後針對該對象進行查詢。 get
您能夠使用LINQ來處理Rows集合上的對象,以下所示: it
var results = from myRow in myDataTable.Rows where myRow.Field("RowNo") == 1 select myRow;
正如@ 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
的項目引用 擴展
您沒法查詢DataTable
的Rows集合,由於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);