数据表上的LINQ查询

时间:2020-03-05 18:39:35  来源:igfitidea点击:

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

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

这是不允许的。我如何获得类似的效果?

我很惊讶在数据表上不允许使用LINQ查询!

解决方案

回答

这并不是故意禁止在DataTables上使用它们,只是DataTables早于可以在其上执行Linq查询的IQueryable和通用IEnumerable结构。

这两个接口都需要某种类型安全性验证。数据表不是强类型的。例如,这就是为什么人们无法针对ArrayList进行查询的相同原因。

为了使Linq正常工作,我们需要针对类型安全的对象映射结果,然后针对该对象进行查询。

回答

我们可以使用LINQ来处理Rows集合上的对象,如下所示:

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

回答

正如@ ch00k所说:

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 &lt;DataRow>。如果需要将" IEnumerable <DataRow>"转换为" DataTable",请使用" CopyToDataTable()"扩展名。

回答

var results = from DataRow myRow in myDataTable.Rows
    where (int)myRow["RowNo"] == 1
    select myRow

回答

var query = from p in dt.AsEnumerable()
                    where p.Field<string>("code") == this.txtCat.Text
                    select new
                    {
                        name = p.Field<string>("name"),
                        age= p.Field<int>("age")                         
                    };