Linq查询空引用异常:if子句验证Null查询未执行else分支
解决Linq查询返回null时的空引用异常问题
嘿,我一眼就看出问题出在哪了!你现在的代码里,当FirstOrDefault()返回null的时候,你直接去访问incidenciaPronosticada.IdIncidenciaPronosticada——这就像你想打开一扇根本不存在的门,程序当然会抛出空引用异常,连if...else判断的机会都没有就直接挂了。
问题根源
你的if条件里先去访问了null对象的属性,这是致命错误。而且原来的条件逻辑也有问题:如果IdIncidenciaPronosticada是值类型(比如int),那它不可能为null,!= null的判断完全多余;同时||逻辑或会导致只要其中一个条件成立就进入if分支,这大概率不是你想要的逻辑。
正确的解决方案
我们需要先判断对象是否存在,再去检查它的属性,这里给你两种常用的写法:
写法1:显式判断对象非null
var incidenciaPronosticada = _c.IncidenciaPronosticadas .Where(x => x.IdIncidenciaPronosticada == item.IdIncidenciaPronosticada) .FirstOrDefault(); // 先确保对象不为null,再判断ID是否有效 if (incidenciaPronosticada != null && incidenciaPronosticada.IdIncidenciaPronosticada != 0) { // 找到有效记录时执行的代码 } else { // 未找到记录,或记录ID无效时执行的代码 }
写法2:使用空条件运算符(C# 6.0+)
用?.运算符可以更简洁地处理空对象,它会在对象为null时直接返回null(值类型会转为可空类型),避免空引用:
var incidenciaPronosticada = _c.IncidenciaPronosticadas .Where(x => x.IdIncidenciaPronosticada == item.IdIncidenciaPronosticada) .FirstOrDefault(); // 如果对象为null,incidenciaPronosticada?.IdIncidenciaPronosticada会返回null,和0比较结果为false if (incidenciaPronosticada?.IdIncidenciaPronosticada != 0) { // 有效记录逻辑 } else { // 空对象或ID为0的逻辑 }
额外优化建议
如果你只是想根据ID查找记录,其实可以把Where和FirstOrDefault合并成一步,代码更简洁:
var incidenciaPronosticada = _c.IncidenciaPronosticadas .FirstOrDefault(x => x.IdIncidenciaPronosticada == item.IdIncidenciaPronosticada);
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

