我有以下LINQ查询
from p in dc.Purchases
where invoiceNumber == null || p.InvNumber == invoiceNumber.Value
select p;
'invoiceNumber'是一个可空的int - 当它为null时,程序抛出'Nullable对象必须有值错误'。当它明确检查它是否为空时为什么会这样?有办法解决这个问题吗?
谢谢,
答案 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;
但是,如果invoiceNumber
为null
,为什么要运行此声明,我会提出问题?
答案 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
HasValue
是boolean
类型,如果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
。
希望它能提供帮助。