使用LINQ到DATASET时DBNULL的问题
-
04-10-2019 - |
题
我有以下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()
(同一语法)使用短路评估,因此一切都可以按预期工作。
在侧节点上,请小心 And
和 Or
具有相同的行为。采用 AndAlso
和 OrElse
相反,如果您需要短路评估。
不隶属于 StackOverflow