C# 可空对象必须有一个值-为什么?

C# 可空对象必须有一个值-为什么?,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我有以下LINQ查询 from p in dc.Purchases where invoiceNumber == null || p.InvNumber == invoiceNumber.Value select p; “invoiceNumber”是一个可为null的int-当它为null时,程序抛出一个“可为null的对象必须有一个值错误”。当它首先显式检查它是否为null时,为什么会出现这种情况?有办法解决这个问题吗 谢谢,试试这个: from p in dc.Purchases whe

我有以下LINQ查询

from p in dc.Purchases
where invoiceNumber == null || p.InvNumber == invoiceNumber.Value
select p;
“invoiceNumber”是一个可为null的int-当它为null时,程序抛出一个“可为null的对象必须有一个值错误”。当它首先显式检查它是否为null时,为什么会出现这种情况?有办法解决这个问题吗

谢谢,

试试这个:

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属性检查可为null的值是否为空

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的值,要么为null,要么具有某个值

e、 g

案例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语句在这两种情况下都有效。

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

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

HasValue
boolean
类型,如果值中有某个值,则会自动将其设置为true。 因此,为了进行比较,必须先使用
HasValue
,然后使用
Value
。如果您直接使用
,并且该值为
null
,则将抛出上述异常

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


谢谢

问题可能出在Linq到Sql中-它正在尝试将where语句转换为Sql,因此invoiceNumber.Value可以调用,即使它为null

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


希望能有所帮助。

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

将空检查更改为
invoiceNumber.HasValue
时是否有任何差异?您使用的是哪种Linq提供程序?Linq到sql,实体框架,Linq到对象?LINQ到SQL。使用hasvalue时没有区别只是猜测,但可能是| |计算的顺序,如果尝试p.InvNumber==invoiceNumber.Value | | invoiceNumber==null,会发生什么情况?如果将“p.InvNumber==invoiceNumber.Value”替换为“p.InvNumber==invoiceNumber”,会不会发生这种情况?没有意义-只有在LINQ to SQL中第一个参数的计算结果为FalsNot时,|运算符才会计算它的第二个参数。将查询转换为SQL,并计算表达式的所有术语。没有像C#那样的短路。使用空合并运算符??(与ISNULL类似)或使用正常的SQL null行为,该行为在值为null时计算为false:
其中p.InvNumber==invoiceNumber
。或者,当invoiceNumber不为null时,添加单独的.Where()条件。如果为null,则应检索everything@Chris,因此,没有where子句的另一个语句将更有效地执行数据库。为什么案例1有where子句?我只想描述相同的linq查询在这两种情况下都会工作。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;
}