可为 null 的对象必须具有值 - 为什么

本文关键字:为什么 null 对象 可为 | 更新日期: 2023-09-27 18:31:41

>我有以下 LINQ 查询

from p in dc.Purchases
where invoiceNumber == null || p.InvNumber == invoiceNumber.Value
select p;

"invoiceNumber"是一个可为空的整数 - 当它为空时,程序会抛出一个"可为空的对象必须有一个值错误"。为什么首先显式检查它是否为 null 时会这样?有没有办法解决这个问题?

谢谢

可为 null 的对象必须具有值 - 为什么

我认为

您的查询有问题。根据您提供的代码,我假设invoiceNumber是局部变量或参数。如果是这种情况,那你为什么还要检查查询中是否有invoiceNumber == null呢?此类检查应与查询分开执行:

if(invoiceNumber == null)
{
    return dc.Purchases; 
    // the query would evaluate to this because invoiceNumber == null will allways return true.
}
else
{
    return 
        from p in dc.Purchases 
        where p.InvNumber == invoiceNumber.Value
        select p;
}

试试这个:

from p in dc.Purchases
where invoiceNumber == null ||(invoiceNumber!=null && p.InvNumber == invoiceNumber.Value)
select p;

检查这个

from p in dc.Purchases
where (invoiceNumber == null ? p.InvNumber == null : p.InvNumber == invoiceNumber.Value)
select p;

from p in dc.Purchases 
where (invoiceNumber ?? p.InvNumber) == p.InvNumber
select p;

但是,我会提出一个问题,如果invoiceNumber null为什么要运行此声明?

使用 HasValue 属性检查 Nullable 是否具有值。

from p in dc.Purchases
where !invoiceNumber.HasValue || p.InvNumber == invoiceNumber.Value
select p;

你没有说,但我怀疑p.InvNumber也是可为空的。在这种情况下,请勿使用以下.Value

from p in dc.Purchases
where invoiceNumber == null || p.InvNumber == invoiceNumber
select p;
你不需要

显式检查null。可能有两种情况下可为空的值为 null 或具有某个值。

例如

案例1-

 int ? invoiceNumber = null;
 var prods = from p in dc.Purchases 
             where p.InvNumber == invoiceNumber
             select p;

案例2-

 int ? invoiceNumber = 100;
 var prods = from p in dc.Purchases 
             where p.InvNumber == invoiceNumber
             select p;

相同的 LINQ 语句在这两种情况下都有效。

问题可能出在 Linq-to-Sql 中 - 它试图将 where 语句转换为 SQL,因此即使它是空的,也可以调用 invoiceNumber.Value。

请尝试invoiceNumber == null || p.InvNumber == invoiceNumber .

希望它能有所帮助。

nullable类型的基本概念是...基础类型将具有其范围中指定的所有值 + 一个null值,以提高数据库编程的灵活性。

可为空的类型具有两个只读属性1) HasValue 2) Value

HasValueboolean类型,如果 Value 中有一些值,它会自动设置为 true。因此,为了进行比较,您必须首先使用HasValue,然后使用Value 。如果直接使用 Value,并且null ,则会抛出上述异常。

记住这些,我也怀疑这个片段,。 invoiceNumber == null在哪里 您应该尝试invoiceNumber.Value==null(而不是发票编号)

where invoiceNumber.HasValue && p.InvNumber == invoiceNumber.Value 

谢谢