【发布时间】:2012-05-22 23:19:23
【问题描述】:
我必须使用 linq 从我的 DataTable 中选择特定列 我正在使用此代码
ds.Table[0].AsEnumerable().Where<DataRow>(r=>r.Field<int>("productID")==23).CopyToDataTable();
~
但它给了我所有的列,我只需要 PRODUCTNAME , DESCRIPTION , PRICE
我该如何编写这个查询?
【问题讨论】:
我必须使用 linq 从我的 DataTable 中选择特定列 我正在使用此代码
ds.Table[0].AsEnumerable().Where<DataRow>(r=>r.Field<int>("productID")==23).CopyToDataTable();
~
但它给了我所有的列,我只需要 PRODUCTNAME , DESCRIPTION , PRICE
我该如何编写这个查询?
【问题讨论】:
要扩展一点@lazyberezovsky,您可以使用匿名类型投影来获取您想要的所有字段:
ds.Table[0].AsEnumerable()
.Where<DataRow>(r => r.Field<int>("productID") == 23)
.Select(r => new { ProductName = r.Field<string>("productName"),
Description = r.Field<string>("description"),
Price = r.Field<decimal>("price") });
我不知道您的产品名称、描述和价格字段是什么名称和类型,因此您必须替换它们。
【讨论】:
使用 Select 方法:
ds.Table[0].AsEnumerable()
.Where<DataRow>(r=>r.Field<int>("productID")==23)
.Select(r => r.Field<int>("productID"));
更新:如果需要选择多列,可以返回匿名类型:
var query = from row in dt.ds.Table[0].AsEnumerable()
where row.Field<int>("productID")==23
select new {
ProductID = x.Field<string>("productID"),
Foo = x.Field<string>("foo")
};
如果您需要将该数据复制到新表,您将面临问题(CopyToDataTable 需要 DataRow 对象的集合)。请参阅How to: Implement CopyToDataTable Where the Generic Type T Is Not a DataRow 解决此问题。
【讨论】: