贝利信息

EF Core GroupBy怎么用 EF Core分组查询教程

日期:2026-01-07 00:00 / 作者:幻夢星雲

EF Core 的 GroupBy 本质是把数据库的 GROUP BY 操作翻译成 LINQ 表达式,关键不是“怎么写”,而是“怎么写才能让 EF 正确生成 SQL 并高效执行”。用错顺序或结构,容易触发客户端分组(即先查全量再内存分组),性能会断崖式下跌。

单字段分组 + 聚合统计

最常用场景:按某个字段分组,算每组数量、总和、平均值等。必须确保 GroupBy 后紧跟 Select,且只引用 g.Key 和聚合函数(Count()Sum()Average() 等)。

多字段分组(组合键)

需要按多个列联合分组时,用匿名对象或元组作 Key。注意 Key 中的字段名要和 Select 中的 g.Key.Xxx 严格对应。

分组后取每组第一条(如最新记录)

这不是纯聚合,但很常见——比如“每个用户最近一次登录日志”。EF Core 8+ 支持 Aggregate 或子查询方式,但最稳妥的是用 ROW_NUMBER() 思路,不过直接写 LINQ 更简洁:

映射到自定义 DTO 或实体类

别硬塞匿名类型,尤其在 API 返回或复用逻辑中。建议定义明确的 DTO 类,并在 Select 中构造它:

基本上就这些。核心就一条:GroupBy 必须在 Select 前,聚合必须在 Select 内,所有字段都得能被 EF 翻译成 SQL。写完可以开 SQL Profiler 看一眼生成的语句,心里就有底了。