5

我有以下 LINQ 查询

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

'invoiceNumber' 是一个可为 null 的 int - 当它为 null 时,程序会抛出一个 'Nullable object must have a value error'。当它首先明确检查它是否为空时,为什么会这样?有没有解决的办法?

谢谢,

4

9 回答 9

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;
}
于 2012-04-24T15:42:36.327 回答
0

尝试这个:

from p in dc.Purchases
where invoiceNumber == null ||(invoiceNumber!=null && p.InvNumber == invoiceNumber.Value)
select p;
于 2012-04-18T10:00:03.247 回答
0

检查这个

from p in dc.Purchases
where (invoiceNumber == null ? p.InvNumber == null : p.InvNumber == invoiceNumber.Value)
select p;
于 2012-04-18T10:08:19.747 回答
0

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

请尝试在哪里invoiceNumber == null || p.InvNumber == invoiceNumber

希望它会有所帮助。

于 2012-04-18T10:41:59.707 回答
0

关于什么

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

但是,我会提出一个问题,如果invoiceNumbernull为什么要运行此语句?

于 2012-04-18T10:09:32.473 回答
0

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

from p in dc.Purchases
where !invoiceNumber.HasValue || p.InvNumber == invoiceNumber.Value
select p;
于 2012-04-18T10:09:39.023 回答
0

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

from p in dc.Purchases
where invoiceNumber == null || p.InvNumber == invoiceNumber
select p;
于 2012-04-18T10:12:01.743 回答
0

您不需要明确检查 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 语句在这两种情况下都适用。

于 2012-04-18T10:15:55.343 回答
0

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

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

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

记住这些,我也怀疑这个片段。invoiceNumber == null 您应该尝试的地方invoiceNumber.Value==null(不是 invoiceNumber)

或者

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

谢谢

于 2012-04-18T10:16:38.297 回答