协慌网

登录 贡献 社区

关于 DataTable 的 LINQ 查询

我正在尝试对 DataTable 对象执行 LINQ 查询,奇怪的是我发现在 DataTables 上执行此类查询并不简单。例如:

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

这是不允许的。我如何得到这样的工作?

我很惊讶 DataTables 上不允许 LINQ 查询!

答案

您无法查询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 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 工作,您需要将结果映射到类型安全的对象,并对其进行查询。