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
相关产品推荐
相关产品推荐

