我有以下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,我会得到强烈的exception。以上代码抛出此异常。但是,如果我删除“ invrecord.pack_num = psnum”,然后将其放置在“ true”之类的位置,则代码正常。

因此,我想我的问题是,为什么当值实际上是dbnull时,那个invrecord.ispack_numnull()返回false,而我可以用作条件呢?我已经撞到墙上了一段时间了,我找不到解决这个问题的解决方案。

有帮助吗?

解决方案

在vb.net中 IIf() 由于它是一个函数,而不是语言语句,因此评估其每一个论点。所以 inv.Record.Pack_Num = PSNum 将始终进行评估。

您可以使用 If() 代替 IIf() (同一语法)使用短路评估,因此一切都可以按预期工作。

在侧节点上,请小心 AndOr 具有相同的行为。采用 AndAlsoOrElse 相反,如果您需要短路评估。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top