0

我有以下 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”之类的内容,则代码可以正常工作。

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

4

1 回答 1

1

在 VB.NET 中,IIf()评估它的每一个参数,因为它是一个函数,而不是一个语言语句。所以inv.Record.Pack_Num = PSNum总会被评价。

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

在侧节点上,请注意具有相同行为的And和。如果您需要短路评估,Or请使用AndAlsoand代替。OrElse

于 2010-05-20T22:10:23.417 回答