EF Core聚合查询将计算下推至数据库执行,需用Count()、Sum()、Avg()等方法生成对应SQL;分组聚合用GroupBy+Select保持IQueryable;注意null处理及类型匹配,避免.ToList()导致内存计算。
EF Core 的聚合查询本质是把计算逻辑下推到数据库执行,而不是在内存里遍历。用对方法,才能既准确又高效。
直接调用 Count()、Sum()、Avg() 等扩展方法,它们会生成 SQL 的对应聚合函数:
context.Orders.Count() → SELECT COUNT(*) FROM Orders
COUNT(CASE WHEN ... THEN 1 END)
x(x => x.CreatedAt) 或 Min(x => x.Price):支持日期、数字、字符串(按字典序)单表聚合往往不够,多数业务需要“按某维度分组再算总数/平均值”。EF Core 支持链式 GroupBy + Select:
context.Orders.GroupBy(o => o.CustomerId).Select(g => new { Id = g.Key, Total = g.Sum(o => o.Amount) })g.Average(o => o.Quantity)、g.Count() 同时用聚合行为和数据库一致,但容易踩坑:
Name IS NOT NULL 的行数,不是总行数聚合必须保持在服务端执行,否则失去意义:
.ToList() 再 .Sum() → 全量查出再内存计算IQueryable 状态context.Orders.ToQueryString()(EF Core 7+)看生成的 SQL基本上就这些。写对表达式,看清字段类型,让数据库干活,别自己搬数据。