我试图在数据表对象上执行LINQ查询,奇怪的是,我发现在数据表上执行这样的查询并不简单。例如:

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

这是不允许的。我怎么才能让这样的东西工作呢?

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


当前回答

试试这个简单的问题:

var result=myDataTable.AsEnumerable().Where(myRow => myRow.Field<int>("RowNo") == 1);

其他回答

正如@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添加一个项目引用

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")                         
                    };

name和age字段现在是查询对象的一部分,可以像这样访问:

在解决方案中很可能已经定义了DataSet、DataTable和DataRow的类。如果是这样的话,就不需要DataSetExtensions引用了。

示例:数据集类名称-> CustomSet,数据流类名称-> CustomTableRow(定义列:RowNo,…)

var result = from myRow in myDataTable.Rows.OfType<CustomSet.CustomTableRow>()
             where myRow.RowNo == 1
             select myRow;

或者(随我喜欢)

var result = myDataTable.Rows.OfType<CustomSet.CustomTableRow>().Where(myRow => myRow.RowNo);

你可以像这样通过linq让它优雅地工作:

from prod in TenMostExpensiveProducts().Tables[0].AsEnumerable()
where prod.Field<decimal>("UnitPrice") > 62.500M
select prod

或者像动态linq这样(AsDynamic直接在DataSet上调用):

TenMostExpensiveProducts().AsDynamic().Where (x => x.UnitPrice > 62.500M)

我更喜欢最后一种方法,因为它是最灵活的。 附注:不要忘记连接System.Data.DataSetExtensions.dll引用

下面提供了如何实现这一目标的示例:

DataSet dataSet = new DataSet(); //Create a dataset
dataSet = _DataEntryDataLayer.ReadResults(); //Call to the dataLayer to return the data

//LINQ query on a DataTable
var dataList = dataSet.Tables["DataTable"]
              .AsEnumerable()
              .Select(i => new
              {
                 ID = i["ID"],
                 Name = i["Name"]
               }).ToList();