我正在尝试对 DataTable 对象执行 LINQ 查询,奇怪的是我发现在 DataTables 上执行此类查询并不简单。例如:
var results = from myRow in myDataTable
where results.Field("RowNo") == 1
select results;
这是不允许的。我如何得到这样的工作?
我很惊讶 DataTables 上不允许 LINQ 查询!
您无法查询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 Expression 的查询,
var result = myDataTable
.AsEnumerable()
.Where(myRow => myRow.Field<int>("RowNo") == 1);
var results = from DataRow myRow in myDataTable.Rows
where (int)myRow["RowNo"] == 1
select myRow
并不是故意不允许在 DataTables 上使用它们,只是 DataTables 会在可以执行 Linq 查询的 IQueryable 和通用 IEnumerable 构造之前进行预定。
两个接口都需要某种类型安全验证。 DataTables 不是强类型的。例如,这与人们无法查询 ArrayList 的原因相同。
要使 Linq 工作,您需要将结果映射到类型安全的对象,并对其进行查询。