SQL to Entity Framework Count Group-By

fef*_*fwe 76 sql linq-to-entities entity-framework group-by count

我需要将此SQL语句翻译成Linq-Entity查询...

SELECT name, count(name) FROM people
GROUP by name
Run Code Online (Sandbox Code Playgroud)

Adu*_*cci 157

查询语法

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

方法语法

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


Sim*_*ver 21

编辑:EF Core 2.1最终支持GroupBy

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


实体框架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认同)
  • 1.1中也没有分组 (4认同)
  • 或1.2或2.0.我放弃 (4认同)
  • 它宣布为2.1 (4认同)

小智 13

一个有用的扩展是在Dictionary快速查找中收集结果(例如在循环中):

var resultDict = _dbContext.Projects
    .Where(p => p.Status == ProjectStatus.Active)
    .GroupBy(f => f.Country)
    .Select(g => new { country = g.Key, count = g.Count() })
    .ToDictionary(k => k.country, i => i.count);
Run Code Online (Sandbox Code Playgroud)

最初在这里找到:http: //www.snippetsource.net/Snippet/140/groupby-and-count-with-ef-in-c


Gre*_*Gum 10

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

这两者都翻译为:

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