C# 执行left outer join时报空引用且finances数据无法返回问题
问题原因
执行左外连接调用DefaultIfEmpty()时,若某条活动数据对应的客户没有匹配的财务数据,返回的y对象会为null,直接访问y.Debtor、y.Creditor属性就会抛出空引用异常。只要存在一条无对应财务数据的活动记录,就会触发该报错。
修复方案
对财务字段做空值兼容处理,匹配不到财务数据时可按业务需求赋值默认值(例如数值类型默认赋值为0),修改后的代码如下:
var qry = events.GroupJoin( finances, ev1 => ev1.CustomerID, fi1 => fi1.CustomerID, (f, bs) => new { events = f, finances = bs }) .SelectMany( eventsFinances => eventsFinances.finances.DefaultIfEmpty(), (x, y) => new RequestEventsDto { CustomerID = x.events.CustomerID, Start = x.events.Start, End = x.events.End, FullName = x.events.FullName, // 空值判断,无匹配财务数据时默认赋值为0 Debtor = y?.Debtor ?? 0, Creditor = y?.Creditor ?? 0 });
如果开发环境不支持?.空条件运算符,可改用三元表达式写法:
Debtor = y != null ? y.Debtor : 0, Creditor = y != null ? y.Creditor : 0
可选优化建议
你当前的写法是先把两个查询的全量数据拉取到内存再执行连接,数据量较大时会有性能损耗,可将两次查询合并为一次EF查询,直接在数据库层面完成左连接操作,降低内存开销提升查询效率。
内容的提问来源于stack exchange,提问作者nnmmss
相关产品推荐
相关产品推荐

