数据表上的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);