110

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

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

5 回答 5

208

查询语法

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() });
于 2012-07-19T15:43:31.103 回答
25

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

于 2016-05-25T19:36:06.417 回答
14

一个有用的扩展是收集结果以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

于 2014-07-15T16:06:51.573 回答
5

这是 .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]
于 2019-01-26T13:06:28.147 回答
1

使用 EF 6.2 它对我有用

  var query = context.People
               .GroupBy(p => new {p.name})
               .Select(g => new { name = g.Key.name, count = g.Count() });
于 2018-04-27T05:19:59.497 回答