我试图对DataTable对象执行LINQ查询,但奇怪的是,我发现对DataTables执行此类查询并不简单。 例如:
var results = from myRow in myDataTable
where results.Field("RowNo") == 1
select results;
这是不允许的。 如何获得类似的效果?
我很惊讶在数据表上不允许使用LINQ查询!
#1楼
尝试这个
var row = (from result in dt.AsEnumerable().OrderBy( result => Guid.NewGuid()) select result).Take(3) ;
#2楼
这并不是故意禁止在DataTables上使用它们,只是DataTables早于可以在其上执行Linq查询的IQueryable和通用IEnumerable结构。
这两个接口都需要某种类型安全性验证。 数据表不是强类型的。 例如,这就是为什么人们无法针对ArrayList进行查询的相同原因。
为了使Linq正常工作,您需要针对类型安全的对象映射结果,然后针对该对象进行查询。
#3楼
您可以使用LINQ来处理Rows集合上的对象,如下所示:
var results = from myRow in myDataTable.Rows where myRow.Field("RowNo") == 1 select myRow;
#4楼
正如@ ch00k所说:
using System.Data; //needed for the extension methods to work
...
var results =
from myRow in myDataTable.Rows
where myRow.Field("RowNo") == 1
select myRow; //select the thing you want, not the collection
您还需要添加对System.Data.DataSetExtensions的项目引用
#5楼
您无法查询DataTable的Rows集合,因为DataRowCollection没有实现IEnumerable 。 您需要为DataTable使用AsEnumerable()扩展。 像这样:
var results = from myRow in myDataTable.AsEnumerable()
where myRow.Field("RowNo") == 1
select myRow;
AsEnumerable()返回IEnumerable 。 如果需要将IEnumerable转换为DataTable ,请使用CopyToDataTable()扩展名。
以下是Lambda表达式查询,
var result = myDataTable
.AsEnumerable()
.Where(myRow => myRow.Field("RowNo") == 1);