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

Pie*_*rto 5 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
Run Code Online (Sandbox Code Playgroud)

让我们假设我必须按颜色分组,有一个债券:我想将red1red2的值分组为redgreen1green2green

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

  Output 

  COLOR    COUNT
  red      2
  green    2
  yellow   1
Run Code Online (Sandbox Code Playgroud)

实体框架可以吗?如何?

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

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) } ) ;
Run Code Online (Sandbox Code Playgroud)

更新 -> 第二个场景

好的,建议的解决方案。

是否可以创建此输出?

  Output 

  COLOR    COUNT
  red      2
  green    2
  yellow   1
  allColor 5
Run Code Online (Sandbox Code Playgroud)

所以,如您所见,我问您如何在我的查询中添加一行,并在所有行上进行聚合计算。是否可以?

val*_*lex 3

要在 LINQ 语句更改中修复它:

GroupBy(x => x.Products.NAME).
Run Code Online (Sandbox Code Playgroud)

GroupBy(x => { if (x.Products.NAME.StartsWith("green")) return "green"; 
               if (x.Products.NAME.StartsWith("red")) return "red"; 
               return x.Products.NAME; }).
Run Code Online (Sandbox Code Playgroud)

回答您的更新问题。您应该将一行与总计连接到您的集合中。只需将 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() 
                                }
                          });
Run Code Online (Sandbox Code Playgroud)