LINQ分组查询问题:按国家统计订单总金额的代码报错求助
解决你的LINQ分组统计订单总金额问题
嘿,作为LINQ新手遇到这种分组关联的问题很正常,我来帮你理清楚问题出在哪,以及怎么修复~
问题根源
你原来的代码里,group o by o.ShipCountry into oByCountry这一步是把Order对象按ShipCountry分组,分组后的oByCountry集合里只有Order的数据,并没有包含关联的Order_Details的UnitPrice和Quantity信息。所以当你写oByCountry.Sum(od.UnitPrice * od.Quantity)时,编译器根本找不到od这个变量,自然会报错。
修复方案
这里有两种常用的修复方式,你可以根据自己的场景选择:
方案1:先关联再投影,然后分组求和
先把Orders和Order_Details关联,然后把需要的字段(国家、单条明细金额)投影到匿名对象里,再按国家分组求和:
var query2 = from o in db.Orders join od in db.Order_Details on o.OrderID equals od.OrderID // 先把需要的字段打包成匿名对象 group new { o.ShipCountry, DetailAmount = od.UnitPrice * od.Quantity } by o.ShipCountry into oByCountry select new TotalPerCountry { Country = oByCountry.Key, // 分组的Key就是ShipCountry Total = oByCountry.Sum(item => item.DetailAmount) };
方案2:利用实体导航属性(如果你的模型有配置的话)
如果你的Order实体类已经配置了和Order_Details的导航属性(比如public ICollection<Order_Details> Order_Details { get; set; }),那可以不用显式写join,直接通过导航属性访问明细:
var query2 = from o in db.Orders group o by o.ShipCountry into oByCountry select new TotalPerCountry { Country = oByCountry.Key, // 先计算每个订单的总金额,再求和同一国家的所有订单 Total = oByCountry.Sum(order => order.Order_Details.Sum(od => od.UnitPrice * od.Quantity)) };
小提示
两种方案都能实现需求,方案1更适合没有配置导航属性的场景,方案2代码更简洁,利用EF的延迟加载或预加载机制来关联数据。
内容的提问来源于stack exchange,提问作者SaraD
相关产品推荐
相关产品推荐

