实体框架6的“按查询分组”中的“案例陈述”

时间:2016-06-08 08:10:33

标签: c# sql sql-server entity-framework group-by

我正在使用Entity Framework 6和SQL Server 2014。

我需要通过查询进行分组。这很容易,但现在我需要一个特例。这是一个澄清我需要的例子。

示例:

Table

ID  COLOR    NAME  
1    red1    aaa
2    red2    vvv
3    green1  fff
4    green2  ggg 
5    yellow  eee

让我们假设我必须按照COLOR分组,带有一个键:我想将值 red1 red2 组合为< em> red 和 green1 green2 green

因此,如果我进行 groupby&amp; count 查询,结果将为:

  Output 

  COLOR    COUNT
  red      2
  green    2
  yellow   1

是否可以使用实体框架?怎么样?

这是我的团队之一。我可以修改它以达到我的目标,还是可以做些不同的事情?

var groupedData = MyData.GroupBy(x => x.Products.NAME).Select(g => new { Product = g.Key, Total = g.Sum(x => x.IMPORT), Quantity = g.Sum(x => x.QTY) } ) ;

更新 - &gt;第二个场景

建议的解决方案。

是否可以创建此输出?

  Output 

  COLOR    COUNT
  red      2
  green    2
  yellow   1
  allColor 5

所以,正如你所看到的,我问你如何在我的查询中添加一行,并在所有行上使用聚合计算。可能吗?

1 个答案:

答案 0 :(得分:2)

要在LINQ语句中修改它:

GroupBy(x => x.Products.NAME).

GroupBy(x => { if (x.Products.NAME.StartsWith("green")) return "green"; 
               if (x.Products.NAME.StartsWith("red")) return "red"; 
               return x.Products.NAME; }).

回答您的更新问题。您应该使用总计将一行连接到您的集合。只需将CONCAT与包含一个元素的新数组一起使用。

var groupedData = MyData.GroupBy(x => { 
          if(x.Products.NAME.StartsWith("green")) return "green";
          if (x.Products.NAME.StartsWith("red")) return "red"; 
          return x.Products.NAME; })
          .Select(g => new { Product = g.Key, Cnt = g.Count()} )
          .Concat(new[] { new { Product = "allColor", 
                                Cnt = MyData.Count() 
                                }
                          });