You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 10:57:35