可为 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 时会这样?有没有办法解决这个问题?
谢谢
您的查询有问题。根据您提供的代码,我假设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
HasValue
是boolean
类型,如果 Value 中有一些值,它会自动设置为 true。因此,为了进行比较,您必须首先使用HasValue
,然后使用Value
。如果直接使用 Value
,并且null
,则会抛出上述异常。
记住这些,我也怀疑这个片段,。 invoiceNumber == null
在哪里 您应该尝试invoiceNumber.Value==null
(而不是发票编号)
或
where invoiceNumber.HasValue && p.InvNumber == invoiceNumber.Value
谢谢