我真的很想使用LINQ,我想知道我需要对下面的表达式做些什么来获取额外的字段
public class Foo
{
public string Name {get;set;}
public string Manufacturer {get;set;}
public float Price {get;set;}
}
var result= (
from row in dt.AsEnumerable()
group row by row.Field<string>("NAME") into g
select new Foo
{
Name = g.Key,
Price=g.Min (x =>x.Field<float>("PRICE"))
//Manufacturer = ????
}
).ToList();
我基本上需要从MANUFACTURER字段中获取制造商并在对象中设置它的值。我试过了:
row.Field<string>("MANUFACTURER")
//and
g.Field<string>("MANUFACTURER")
但我没有运气访问DataTable中的字段。任何人都可以建议我做错了吗?
答案 0 :(得分:2)
所以你想按名字分组。但是,您希望如何聚合每个名称组的制造商?
假设您只想要第一个制造商:
var result= (
from row in dt.AsEnumerable()
group row by row.Field<string>("NAME") into g
select new Foo
{
Name = g.Key,
Price=g.Min (x =>x.Field<float>("PRICE")),
Manufacturer = g.First().Field<string>("MANUFACTURER")
}
).ToList();
也许您想要使用分隔符连接所有内容:
// ...
Manufacturer = string.Join(",", g.Select(r=> r.Field<string>("MANUFACTURER")))
答案 1 :(得分:1)
根据您的逻辑,如果您只按名称分组,则可能有多个制造商。 为了说明这一点,请考虑以下数据,这些数据由您的数据结构支持。
示例强>
如果您只按“ProductA”分组,则制造商是[“ManufacturerA”,“ManufacturerB”]的集合
潜在解决方案
您可以按名称和制造商进行分组,然后同时访问名称和制造商
var result= (
from row in dt.AsEnumerable()
group row by new
{
row.Field<string>("NAME"),
row.Field<string>("MANUFACTURER")
} into g
select new Foo
{
Name = g.Key.Name,
Manufacturer = g.Key.Manufacturer,
Price=g.Min (x =>x.Field<float>("PRICE"))
}
).ToList();
基于评论“我试图以最便宜的价格和制造商一起提取名称。”
var result= (
from row in dt.AsEnumerable()
group row by row.Field<string>("NAME") into g
let x = new
{
Name = g.Key.Name,
Price=g.Min (x =>x.Field<float>("PRICE"))
}
where (row.Name == x.Name && row.Price == x.Price)
select new Foo
{
Name = row.Name,
Manufacturer = row.Manufacturer,
Price= row.Price
}
).ToList();