C# 通过使用linq选择新阵列进行分组
我需要linq查询的帮助 我有一个带有名称、库存和其他字段的产品表。可以有“重复”的产品名称,但有“不同的库存” 我需要3样东西:C# 通过使用linq选择新阵列进行分组,c#,asp.net,linq,C#,Asp.net,Linq,我需要linq查询的帮助 我有一个带有名称、库存和其他字段的产品表。可以有“重复”的产品名称,但有“不同的库存” 我需要3样东西: 选择所有产品并按名称分组 在选择中,对具有相同名称的产品的库存字段求和 Select应该在“数组”中检索,因为我将通过JSON发送它 例如,如果我有一支库存为1的产品笔 然后是另一款同名“笔”但库存为3的产品 然后,我的选择必须只给我1行,名称为“笔”,库存为“4” 我曾经有过这样一个问题: var result = (from c in Produ
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();
它可以工作,但现在我需要添加“分组依据”产品名称,并对每个同名产品的库存进行汇总,但我不知道如何使用基于方法的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();
注意:我在分组键中同时包含名称和族,因为您的结果需要这两者。我将在基于方法的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();
注:我在分组键中同时包含姓名和族,因为您的结果需要这两者。如果我很了解您的问题,您看起来是这样的:
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();
您可以在此找到有关如何使用group
子句的更多信息
更新
如果您想在投影中添加另一个字段,而您不介意该字段的值(如您在注释中所述),则可以使用First
扩展方法:
new {g.Key.Name,
g.Key.Family,
Country=g.First().Country,
Inventory=g.Sum(e=>e.Inventory)}
如果我很了解你的问题,你看起来像这样:
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();
您可以在此找到有关如何使用group
子句的更多信息
更新
如果您想在投影中添加另一个字段,而您不介意该字段的值(如您在注释中所述),则可以使用First
扩展方法:
new {g.Key.Name,
g.Key.Family,
Country=g.First().Country,
Inventory=g.Sum(e=>e.Inventory)}
这里有答案:这里有答案:哦,好的!如果我在select上需要更多的字段,例如:String.Format(“{0:c}”,c.Price)只需添加
Price=String.Format(“{0:c}”,g.Sum(x=>x.Price))
或select
语句中的任何其他聚合函数。您可以将其添加为键(如果它对所有同名产品都相同)或者作为第二个计算字段,如Price=g.Average(x=>x.Price)或任何其他聚合函数,具体取决于您的需要。例如,我有一个字段“Country”,它是一个字符串,但不能分组,因为有来自不同国家的同名产品。在这种情况下,我想我不能聚合一个“字符串”,也不能分组,因为有不同的国家。我不管在这种情况下它应该显示哪个国家,这里的解决方案是什么?如果你可以显示产品组中的任何国家,那么你可以这样做:AnyCountry=g.Select(x=>c.country)。FirstOrDefault()。哦,好的!如果我在select上需要更多的字段,例如:String.Format(“{0:c}”,c.Price)只需添加Price=String.Format(“{0:c}”,g.Sum(x=>x.Price))
或select
语句中的任何其他聚合函数。您可以将其添加为键(如果它对所有同名产品都相同)或者作为第二个计算字段,如Price=g.Average(x=>x.Price)或任何其他聚合函数,具体取决于您的需要。例如,我有一个字段“Country”,它是一个字符串,但不能分组,因为有来自不同国家的同名产品。在这种情况下,我想我不能聚合一个“字符串”,也不能分组,因为有不同的国家。在这种情况下,我不在乎它应该显示哪个国家,这里的解决方案是什么?如果你可以显示产品组中的任何国家,那么你可以这样做:AnyCountry=g.Select(x=>c.country)。FirstOrDefault().g.First在Linq to Entities中不起作用,因为它应该是FirstOrDefault用户从来没有提到过他正在使用EF。事实并非如此,因为他提到此解决方案也适用于EDG。First在Linq to Entities中不起作用,因为它应该是Firstor默认。用户从未提及他正在使用EF。事实并非如此,因为他提到这个解决方案也有效