使用Entity Framework按用户分组订单统计总价格报错如何解决
错误原因
这个报错是因为EF Core无法将GroupBy后直接访问多级导航属性的聚合操作(s.Product.Price)翻译成原生SQL,属于EF Core LINQ翻译的限制。
解决方案
方案1:提前展开导航属性再分组(推荐,服务端执行,性能好)
先把需要的字段扁平化投影出来再分组,不需要加载多余数据,所有逻辑都可以在数据库端执行:
var orders = _db.Orders .Select(o => new { o.User.UserName, o.Product.Price }) .GroupBy(x => x.UserName) .Select(g => new { userName = g.Key, toolsCount = g.Count(), totalPrice = g.Sum(x => x.Price) }) .ToList();
方案2:显式客户端求值(仅适合数据量小的场景)
如果不想调整查询结构,可以提前把关联数据加载到内存后再做分组聚合:
var orders = _db.Orders .Include(o => o.User) .Include(o => o.Product) .AsEnumerable() .GroupBy(x => x.User.UserName) .Select(x => new { userName = x.Key, toolsCount = x.Count(), totalPrice = x.Sum(s => s.Product.Price) }) .ToList();
该方案会拉取所有订单、关联用户和商品的全量数据到内存,数据量大时会有明显性能损耗,不推荐生产环境大表使用。
内容的提问来源于stack exchange,提问作者adel Ibrahim
相关产品推荐
相关产品推荐

