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

