可以为空的对象必须有一个值 - 为什么?

时间:2012-04-18 09:56:23

标签: c# linq linq-to-sql

我有以下LINQ查询

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

'invoiceNumber'是一个可空的int - 当它为null时,程序抛出'Nullable对象必须有值错误'。当它明确检查它是否为空时为什么会这样?有办法解决这个问题吗?

谢谢,

9 个答案:

答案 0 :(得分:2)

我认为你的查询有问题。从您提供的代码中我假设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;
}

答案 1 :(得分:0)

试试这个:

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

答案 2 :(得分:0)

检查一下

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

答案 3 :(得分:0)

怎么样

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

您不需要显式检查null。 有两个可以为空的值的情况,它们将为null或具有某些值。

e.g。

案例1 -

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

CASE 2-

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

同样的linq语句将适用于这两种情况。

答案 7 :(得分:0)

nullable类型的基本概念是......基础类型将在其范围内指定所有值+ null值,以增加数据库编程的灵活性。

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

HasValueboolean类型,如果Value中有值,则会自动设置为true。 因此,对于比较,您必须先使用HasValue,然后再使用Value。如果您直接使用Value,如果它是null,则会抛出上述异常。

记住这些,我也怀疑这个片段。其中invoiceNumber == null 你应该试试invoiceNumber.Value==null(不是invoiceNumber)

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

感谢

答案 8 :(得分:0)

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

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

希望它能提供帮助。