使用linq分组选择新数组

时间:2016-02-21 20:22:44

标签: c# asp.net linq

我需要linq查询的帮助

我有一个包含名称,库存和其他字段的产品表。 可以有“重复”的产品名称,但“库存不同” 我需要3件事:

  1. 选择所有产品并按名称分组
  2. 在SELECT中,汇总具有相同名称的产品的库存字段
  3. Select应该在“数组”上进行检索,因为我将通过JSON发送它
  4. 因此,例如,如果我有一个产品笔与库存1 然后是另一个同名“笔”但库存为3的产品

    然后我的选择必须给我一行,名称为“pen”,库存为“4”

    我曾经有这样的查询:

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

    它有效,但现在我需要添加“分组依据”产品名称,并将每个产品的库存总和相同,但我不知道如何

2 个答案:

答案 0 :(得分:1)

我会用基于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();

注意我在分组键中包含Name和Family,因为您的结果都需要。

答案 1 :(得分:1)

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

  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 page中找到有关如何使用group子句的详细信息。

更新

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

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