【问题标题】:LINQ Expression accessing more fieldsLINQ 表达式访问更多字段
【发布时间】:2014-10-21 08:04:04
【问题描述】:

我对使用 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 中的字段。谁能告诉我我做错了什么?

【问题讨论】:

  • 嗯,一个组包含一行或多行,所以可能有几个不同的制造商......你想要哪一个?这个问题更多的是功能而不是技术。
  • 这里的问题是你试图选择Foo,就好像它是一个单一的项目(它可能是),但是按项目分组g本身就是一个IEnumerable(因此你需要做Min 以获得标量价格)。这就是您尝试从多个项目集中选择标量制造商时遇到的问题。

标签: c# .net linq


【解决方案1】:

所以你想按名称分组。但是您希望如何聚合每个名称组的制造商?

假设你只想拿第一个制造商:

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

【讨论】:

  • 加入他们是一个不错的解决方案
【解决方案2】:

按照您的逻辑,如果您仅按名称分组,您可能拥有多个制造商。 为了说明这一点,请考虑您的数据结构支持的以下数据。

示例

  • 产品A,制造商A
  • 产品A,制造商B

如果您仅按“ProductA”分组,则 Manufacturer 是 ["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();

【讨论】:

  • 是否可以按名称分组但也可以拉制造商?这基本上就是我所追求的。正如我所提到的,我对 LINQ 仍然很陌生,以上是我迄今为止管理过的最好的。表中的每一行都有不同的制造商,这就是为什么我试图让他们从同一行拉出来
  • 您尝试做的问题主要是功能性的,如果您按名称分组,那么制造商就是一个集合。这是因为根据您的数据结构,一个名称可能有多个制造商。
  • 有道理,嗯。基本上我有一个包含 3 列的数据表;名称、价格、制造商。我可能有 10 行具有相同名称、不同价格和相同制造商的行。我试图以最便宜的价格提取名称和制造商,并将其作为对象保存在列表中。上面的查询对前两个非常有效,但我正在努力将制造商拉到一起。 LINQ 很难大声笑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多