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

LINQ查询在LINQPad正常,Web API触发空值异常求助

问题分析与解决方案

这个异常的根源在于左连接后产生的null值没有被正确处理,导致后续计算中出现了未赋值的可空类型访问:

你用DefaultIfEmpty()做了左连接,意味着当opTOs中没有匹配g.itemCode的记录时,op会是null。此时如果opqty是值类型(比如int),op.opqty就会变成null(因为引用类型为null时,它的值类型属性会被包装成可空类型)。

当你执行g.availQty - op.opqty时,如果g.availQty是非可空值类型,结果会是一个int?(可空整数)。后续的Where(w => w.qty > 0)在处理这个可空值时,EF Core 2.2的查询处理器可能会隐式尝试访问它的Value属性(而LINQPad用的是不同的查询提供者,对这种情况的容错性更强),当qty为null时就会抛出“Nullable object must have a value”异常。

修复方案

只需要在计算qty时,用空合并运算符把op.opqty的null值替换为0,确保减法结果是一个非可空值:

var GRStk = (from g in GRStkB4 
             join t1 in opTOs on g.itemCode equals t1.itemCode into temp1 
             from op in temp1.DefaultIfEmpty() 
             select new { 
                 g.branchCode, 
                 g.itemCode, 
                 // 处理op为null的情况,把opqty的null替换成0
                 qty = g.availQty - (op?.opqty ?? 0) 
             }).AsEnumerable()
               .Where(w => w.qty > 0);

int ii = GRStk.Count();

如果g.availQty本身也是可空类型,那也要同样处理它的null情况:

qty = (g.availQty ?? 0) - (op?.opqty ?? 0)

这样修改后,qty始终是一个非可空的数值,后续的筛选和计数操作就不会再触发异常了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:39:05