SQL to Entity Framework Count Group-By

Posted

技术标签:

【中文标题】SQL to Entity Framework Count Group-By【英文标题】: 【发布时间】:2012-07-18 20:13:14 【问题描述】:

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

SELECT name, count(name) FROM people
GROUP by name

【问题讨论】:

如果有人想group by + join rows data,请参阅***.com/questions/12558509/… 【参考方案1】:

查询语法

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() );

【讨论】:

【参考方案2】:

编辑:EF Core 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

【讨论】:

感谢您的提醒 在 1.1 中也没有分组 或 1.2 或 2.0。我放弃了 2.1 发布 这可能会产生误导,我认为更新您的答案并明确提及 EF 7 之前的 EF 版本支持分组很重要。这个答案更像是评论而不是对 OP 问题的实际答案,当单独阅读时会产生误导(并且被解释为对 OP 的答案,而不是)。阅读本文时,人们可能会产生错误的印象,好像 EF 7 也不支持分组,而且很明显早期版本不支持分组,这是不正确的。【参考方案3】:

一个有用的扩展是在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);

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

【讨论】:

【参考方案4】:

这是 .net core 2.1 中 group by 的简单示例

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]

【讨论】:

【参考方案5】:

EF 6.2 对我有用

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

【讨论】:

以上是关于SQL to Entity Framework Count Group-By的主要内容,如果未能解决你的问题,请参考以下文章

linq to sql、Entity Framework 和 NHibernate 的性能如何?

AD0.NET Entity Framework 4.0 或 Linq-to-SQL

使用内置 Linq to SQL 驱动程序在 LinqPad 中运行 Entity Framework Core 查询的更简单方法?

Entity Framework 4 / POCO - 从哪里开始? [关闭]

连接字符串 C# Entity Framework SQL Server Express

为啥 Entity Framework 6 会为简单的查找生成复杂的 SQL 查询?