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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:54:03