LINQ表达式访问更多字段

时间:2014-10-21 08:04:05

标签: c# .net linq

我真的很想使用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中的字段。任何人都可以建议我做错了吗?

2 个答案:

答案 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
  • ProductA,ManufacturerB

如果您只按“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();