分组依据,使用 linq 选择新阵列
本文关键字:新阵列 阵列 选择 linq 使用 | 更新日期: 2023-09-27 18:35:33
我需要有关 linq 查询的帮助
我有一个包含名称、库存和其他字段的产品表。可以有"重复"的产品名称,但具有"不同的库存"。
我需要 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});
它可以工作,但现在我需要添加"分组依据"产品名称,并汇总具有相同名称的每个产品的库存,但我不知道如何
如果我很好地理解你的问题,你看起来像这样:
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();
请注意,我在分组键中包含名称和系列,因为您的结果需要两者。