SQL到实体框架按组计数


Answers:


181

查询语法

var query = from p in context.People
            group p by p.name into g
            select new
            {
              name = g.Key,
              count = g.Count()
            };

方法语法

var query = context.People
                   .GroupBy(p => p.name)
                   .Select(g => new { name = g.Key, count = g.Count() });

22

编辑:EF核心2.1终于支持GroupBy

但是请始终在控制台/日志中查找消息。如果您看到一条通知,指出您的查询无法转换为SQL,将在本地进行评估,则可能需要重写它。


Entity Framework 7(现已重命名为Entity Framework Core 1.0 / 2.0)尚不支持在生成的SQL中GroupBy()进行转换GROUP BY(即使在最终的1.0版本中也不会)。任何分组逻辑都将在客户端上运行,这可能会导致加载大量数据。

最终,这样编写的代码将自动开始使用GROUP BY,但是现在,如果将整个未分组的数据集加载到内存中会导致性能问题,则需要非常谨慎。

对于这是一个破坏交易的情况,您将必须手工编写SQL并通过EF执行它。

如果有疑问,请启动Sql Profiler并查看生成的内容-无论如何您都应该这样做。

https://blogs.msdn.microsoft.com/dotnet/2016/05/16/announcing-entity-framework-core-rc2


5
感谢您的抬头
雅各布斯塔姆

4
也没有在1.1中分组
Simon_Weaver

4
或1.2或2.0。我放弃
Simon_Weaver

4
它宣布2.1
Yush0

这可能会误导您,我认为重要的是更新您的答案并明确提及早于EF 7的EF版本支持分组。当单独阅读该答案时,它比对OP问题的实际答案更具注释性,并且会误导他人(并被解释为对非OP的答案)。在阅读本文时,可能会产生错误的印象,好像EF 7也不支持分组,而且显然早期的版本也不支持分组,这是不正确的。
BornToCode


1

这是.net core 2.1中的分组依据的简单示例

var query = this.DbContext.Notifications.
            Where(n=> n.Sent == false).
            GroupBy(n => new { n.AppUserId })
            .Select(g => new { AppUserId = g.Key, Count =  g.Count() });

var query2 = from n in this.DbContext.Notifications
            where n.Sent == false
            group n by n.AppUserId into g
            select new { id = g.Key,  Count = g.Count()};

转换为:

SELECT [n].[AppUserId], COUNT(*) AS [Count]
FROM [Notifications] AS [n]
WHERE [n].[Sent] = 0
GROUP BY [n].[AppUserId]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.