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

使用Linq左外连接更新Person对象时如何避免空引用异常?

左外连接Person对象时避免空引用异常的解决方案

我需要基于firstname和lastname对Person对象做左外连接来增强数据,之后调用UpdatePerson方法更新对象并返回结果。但现在出现了空引用异常,移除DefaultIfEmpty就变成内连接了,不符合需求,我知道要处理空值,但不知道怎么正确操作。

当前左外连接代码

person = from p in person
    join epd in enhancedPersonData
        on new { p.firstname, p.lastname} equals new { epd.firstname, epd.lastname} into epdJoin
    from epdj in epdJoin.DefaultIfEmpty()
    select p.UpdatePerson(epdj);

尝试过的内连接代码(不符合左外连接需求)

person = from p in person
    join epd in enhancedPersonData
        on new { p.firstname, p.lastname} equals new { epd.firstname, epd.lastname}
    select p.UpdatePerson(epd);

Person类定义

public class Person
{
    public string Firstname{ get; set; }
    public string Lastname{ get; set; }
    public string Address{ get; set; }
    
    public Person(string firstname, string lastname){
        Firstname = firstname;
        Lastname = lastname;
    }
}

原UpdatePerson方法(存在空引用风险)

public static Person UpdatePerson (this Person schema,
    EnhancedPersonData enhancedPersonData)
{
    if (!string.IsNullOrEmpty(enhancedPersonData.Address)) 
    {
        schema.Address = enhancedPersonData.Address;
    }
}

解决方案

修改后的UpdatePerson方法

通过**空值传播运算符?.**处理左外连接中可能出现的enhancedPersonData为null的情况,同时补充方法缺失的返回语句(符合方法签名要求):

public static Person UpdatePerson (this Person schema,
    EnhancedPersonData enhancedPersonData)
{
    if (!string.IsNullOrEmpty(enhancedPersonData?.Address)) 
    {
        schema.Address = enhancedPersonData.Address;
    }
    return schema;
}

左外连接代码保持不变

原左外连接的逻辑无需修改,继续使用即可:

person = from p in person
    join epd in enhancedPersonData
        on new { p.firstname, p.lastname} equals new { epd.firstname, epd.lastname} into epdJoin
    from epdj in epdJoin.DefaultIfEmpty()
    select p.UpdatePerson(epdj);

内容的提问来源于stack exchange,提问作者Virt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:40:58