我有以下 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'。当它首先明确检查它是否为空时,为什么会这样?有没有解决的办法?
谢谢,
我有以下 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'。当它首先明确检查它是否为空时,为什么会这样?有没有解决的办法?
谢谢,
我认为您的查询有问题。从您提供的代码中,我假设这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;
问题可能出在 Linq-to-Sql 中——它试图将 where 语句转换为 SQL,因此即使它为 null,也可以调用 invoiceNumber.Value。
请尝试在哪里invoiceNumber == null || p.InvNumber == invoiceNumber
。
希望它会有所帮助。
关于什么
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 。可空值可能有两种情况,要么为空,要么具有某些值。
例如
情况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 语句在这两种情况下都适用。
类型的基本概念nullable
是......底层类型将具有在其范围内指定的所有值+一个null
值,以增加数据库编程的灵活性。
可空类型有两个只读属性 1) HasValue
2)Value
HasValue
是boolean
类型,如果 Value 中有一些值,它会自动设置为 true。因此,对于比较,您必须先使用HasValue
,然后再使用Value
. 如果你Value
直接使用,如果是null
,则会抛出上述异常。
记住这些,我也怀疑这个片段。invoiceNumber == null
您应该尝试的地方invoiceNumber.Value==null
(不是 invoiceNumber)
或者
where invoiceNumber.HasValue && p.InvNumber == invoiceNumber.Value
谢谢