SQL 到实体框架计数组

我需要将这个 SQL语句转换为 Linq-Entity查询..。

SELECT name, count(name) FROM people
GROUP by name
167741 次浏览

查询语法

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

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

Edit: EF Core 2.1 finally supports GroupBy

但总是在控制台/日志中寻找消息。如果您看到无法将查询转换为 SQL 并将在本地进行计算的通知,则可能需要重写该通知。


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

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

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

如果有疑问,启动 SqlProfiler 并查看生成了什么——无论如何您都应该这样做。

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

with EF 6.2 it worked for me

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

下面是.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]