Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过使用linq选择新阵列进行分组_C#_Asp.net_Linq - Fatal编程技术网

C# 通过使用linq选择新阵列进行分组

C# 通过使用linq选择新阵列进行分组,c#,asp.net,linq,C#,Asp.net,Linq,我需要linq查询的帮助 我有一个带有名称、库存和其他字段的产品表。可以有“重复”的产品名称,但有“不同的库存” 我需要3样东西: 选择所有产品并按名称分组 在选择中,对具有相同名称的产品的库存字段求和 Select应该在“数组”中检索,因为我将通过JSON发送它 例如,如果我有一支库存为1的产品笔 然后是另一款同名“笔”但库存为3的产品 然后,我的选择必须只给我1行,名称为“笔”,库存为“4” 我曾经有过这样一个问题: var result = (from c in Produ

我需要linq查询的帮助

我有一个带有名称、库存和其他字段的产品表。可以有“重复”的产品名称,但有“不同的库存”

我需要3样东西:

  • 选择所有产品并按名称分组
  • 在选择中,对具有相同名称的产品的库存字段求和
  • Select应该在“数组”中检索,因为我将通过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();
    

    它可以工作,但现在我需要添加“分组依据”产品名称,并对每个同名产品的库存进行汇总,但我不知道如何使用基于方法的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。事实并非如此,因为他提到这个解决方案也有效