EF Core中[NotMapped]属性无法获取外键关联值导致计算异常求助
问题根本原因
你查询Member数据时没有主动加载关联的导航属性(BillDetails、Payments、DueReconciles),EF Core默认不会自动拉取关联表的数据,所以返回的Member对象里这些集合只会保留构造函数初始化的空列表,求和自然得到0的结果。
解决方法
方法1:显式加载关联导航属性
修改Service层的查询逻辑,用Include方法指定需要加载的关联集合,适合你需要用到明细数据的场景:
var lists = _memberRepository.Query() .AsNoTracking() .Include(x => x.BillDetails) .Include(x => x.Payments) .Include(x => x.DueReconciles) .Where(x => x.OrgId == orgId) .ToList();
注意:确保你的仓库
Query()方法返回的是IQueryable<Member>类型,才能正常调用Include扩展方法。
方法2:查询阶段直接计算余额(性能最优)
如果关联表数据量大,全量加载明细会浪费性能,你可以直接在数据库层面完成求和计算,不需要加载全量明细到内存:
var lists = _memberRepository.Query() .AsNoTracking() .Where(x => x.OrgId == orgId) .Select(m => new Member { // 赋值所有基础属性 Id = m.Id, Code = m.Code, Title = m.Title, Gender = m.Gender, FirstName = m.FirstName, LastName = m.LastName, SpouseName = m.SpouseName, NationalId = m.NationalId, OpeningBalance = m.OpeningBalance, Organization = m.Organization, // 直接在SQL端计算余额 CurrentBalance = Math.Round((m.OpeningBalance + m.BillDetails.Where(b => b.IsActive).Sum(b => b.Amount)) - (m.Payments.Where(p => p.IsActive).Sum(p => p.Amount) + m.DueReconciles.Where(d => d.IsActive).Sum(d => d.ReconcileAmount)), 2) }).ToList();
这种方式所有计算逻辑会转化为SQL执行,只返回你需要的最终结果,性能远高于加载全量明细再计算。
不推荐的方案
不要为了这个需求开启懒加载,懒加载在AsNoTracking跟踪模式下不会生效,还会产生N+1查询问题,额外增加数据库的压力。
内容的提问来源于stack exchange,提问作者mnu-nasir
相关产品推荐
相关产品推荐

