我正在使用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
所以,正如你所看到的,我问你如何在我的查询中添加一行,并在所有行上使用聚合计算。可能吗?
答案 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()
}
});