分组依据,使用 linq 选择新阵列

本文关键字:新阵列 阵列 选择 linq 使用 | 更新日期: 2023-09-27 18:35:33

我需要有关 linq 查询的帮助

我有一个包含名称、库存和其他字段的产品表。可以有"重复"的产品名称,但具有"不同的库存"。

我需要 3 件事:

  1. 选择所有产品并按名称分组
  2. 在"选择"中,对具有相同名称的产品的库存字段求和
  3. 选择应该在"数组"上检索,因为我将通过 JSON 发送它

例如,如果我有一个库存为 1 的产品笔。

然后是另一个同名"笔"但库存为 3 的产品

然后我的选择必须只给我 1 行名称为"笔"和库存"4"

我曾经有这样的查询:

        var result = (from c in Products
                      where c.Inventory != 0
                      select new[] {
                         Convert.ToString(i++),
                         c.Name,
                         c.Family,
                         c.Inventory});

它可以工作,但现在我需要添加"分组依据"产品名称,并汇总具有相同名称的每个产品的库存,但我不知道如何

分组依据,使用 linq 选择新阵列

如果我很好地理解你的问题,你看起来像这样:

  var result = (from c in Products
                where c.Inventory != 0
                group c by new{c.Name,c.Family} into g
                select new {g.Key.Name, g.Key.Family, Inventory=g.Sum(e=>e.Inventory)}).ToArray();

您可以在此 msdn 页中找到有关如何使用group子句的详细信息。

更新

如果您想在投影中添加另一个您不介意哪个值的字段(如您在评论中描述的那样),您可以使用First扩展方法:

new {g.Key.Name, 
     g.Key.Family,
     Country=g.First().Country, 
     Inventory=g.Sum(e=>e.Inventory)}

我将在基于方法的sintax中编写,因为不用于基于查询:

var result = products.GroupBy(p=>new {p.Name,p.Family},(key,g)=>new {
    key.Name,
    key.Family,
    Inventory=g.Sum(x=>x.Inventory)
}).ToArray();

请注意,我在分组键中包含名称和系列,因为您的结果需要两者。