如何在Order模型的SumPrice字段中显示子属性Price的求和值
解决方案:实现Order模型SumPrice动态计算子项Price总和
第一步:修正模型关联错误
原模型存在两处关联逻辑错误,先修正确保一对多关系正常:
修正后的Order模型
public class Order { [Key] public int Id { get; set; } public string Title { get; set; } public DateTime Date { get; set; } // 改为动态计算属性,不映射数据库字段 public long SumPrice => OrderDetails?.Sum(d => d.Price) ?? 0; // 修正集合类型为实际子模型类InvoicesDetails public ICollection<InvoicesDetails> OrderDetails { get; set; } = new List<InvoicesDetails>(); }
修正后的InvoicesDetails模型
public class InvoicesDetails { [Key] public int Id { get; set; } public string Title { get; set; } public long Quantity { get; set; } public long Price { get; set; } public int OrderId { get; set; } // 修正ForeignKey参数,指向外键字段OrderId [ForeignKey(nameof(OrderId))] public virtual Order Order { get; set; } }
第二步:关键注意事项
- 避免N+1查询问题:如果启用延迟加载,访问
SumPrice时会自动加载子项,但会产生多次查询。建议查询Order时主动关联子项:var orders = _context.Orders.Include(o => o.OrderDetails).ToList(); - 排除数据库映射:如果原
SumPrice已在数据库有对应字段,需移除该字段,或给计算属性添加[NotMapped]标记,避免EF尝试映射:[NotMapped] public long SumPrice => OrderDetails?.Sum(d => d.Price) ?? 0;
替代方案:查询时直接计算
若不想在模型中定义计算属性,可在查询阶段直接投影计算总和:
var ordersWithSum = _context.Orders .Select(o => new { Order = o, SumPrice = o.OrderDetails.Sum(d => d.Price) }) .ToList();
内容的提问来源于stack exchange,提问作者AliRam
相关产品推荐
相关产品推荐

