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)
让我们假设我必须按颜色分组,但有一个债券:我想将red1和red2的值分组为red,green1和green2为green。
因此,如果我进行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)
所以,如您所见,我问您如何在我的查询中添加一行,并在所有行上进行聚合计算。是否可以?
要在 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)