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

