Vb.net 使用LINQ到数据集时DBNull出现问题

Vb.net 使用LINQ到数据集时DBNull出现问题,vb.net,linq,dbnull,linq-to-dataset,Vb.net,Linq,Dbnull,Linq To Dataset,我有以下LINQ声明: Dim PSNum As Integer = 66 Dim InvSeq = (From invRecord In InvSeqDataSet.RptInvSeqDT.AsQueryable() _ Where IIf(invRecord.IsPack_NumNull(), False, invRecord.Pack_Num = PSNum) _ Select New With _

我有以下LINQ声明:

Dim PSNum As Integer = 66 
Dim InvSeq = (From invRecord In InvSeqDataSet.RptInvSeqDT.AsQueryable() _
                Where IIf(invRecord.IsPack_NumNull(), False, invRecord.Pack_Num = PSNum) _
                Select New With _
                {.Inv = invRecord.Invoice_Num, .Seq = invRecord.Inv_Seq}).FirstOrDefault()
invRecord.Pack_Num是整型字段。这意味着当我试图访问它时,如果它是DBNull,我会得到一个StronglyTypedException。上面的代码引发此异常。但是,如果我删除“invRecord.Pack_Num=PSNum”并在其位置放置类似“True”的内容,那么代码工作正常

所以我想我的问题是,为什么invRecord.IsPack_NumNull()在值实际上是DBNull时返回False,我可以使用什么作为条件呢?我已经头痛了一段时间,找不到解决这个问题的方法。

在VB.NET中,
IIf()
计算它的每个参数,因为它是一个函数,而不是一个语言语句。因此,将始终计算
inv.Record.Pack_Num=PSNum

您可以使用
If()
而不是
IIf()
(相同的语法),它使用短路评估,因此一切都将按预期工作


在侧节点上,注意具有相同行为的
。如果您需要短路评估,请使用
以及
来代替。

是的,您是对的。我不确定我怎么会错过这个,但我认为是相反的。直觉上,我一直认为IIf的意思是“如果且仅当”,这意味着我所追求的“短路”行为。无论如何,非常感谢。我想VB语言团队的本意是“inline if”。