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

Entity Framework Core 从导航属性查询获取MemberBill类型对象集合方案

正确实现代码

直接在IQueryable层面做投影,不需要提前加载导航属性,EF Core会自动解析生成最优SQL,避免加载冗余字段:

List<MemberBill> result = _memberRepository.Query()
    .Where(x => x.IsActive && x.OrgId == orgId)
    .Select(x => new MemberBill
    {
        MemberId = x.Id,
        // 此处Sum的属性替换为你BillDetail类中实际存储金额的字段名即可
        BillAmount = x.BillDetails.Where(y => y.IsActive).Sum(y => y.Amount)
    })
    .AsNoTracking()
    .ToList();

原有代码问题说明

  • 提前调用Include加载导航属性完全没必要,投影查询时EF会自动处理关联查询,多余的Include反而会拉取不需要的字段降低性能
  • 第一次Select(x => x.BillDetails).ToList()只提取了账单明细集合,丢失了关联的MemberId字段,导致后续无法给MemberBill的MemberId赋值
  • 多次不必要的ToList会把全量数据加载到内存后再处理,数据量大时性能损耗非常大

特殊场景备选方案(如果确实需要先加载全量明细再做业务处理)

var membersWithBills = _memberRepository.Query()
    .Where(x => x.IsActive && x.OrgId == orgId)
    .Include(x => x.BillDetails.Where(y => y.IsActive))
    .AsNoTracking()
    .ToList();

List<MemberBill> result = membersWithBills.Select(x => new MemberBill
{
    MemberId = x.Id,
    BillAmount = x.BillDetails.Sum(y => y.Amount) // 按需调整统计逻辑
}).ToList();

内容的提问来源于stack exchange,提问作者mnu-nasir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 11:24:03