Проблема с dbnull при использовании linq к набору данных
-
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()
invrecd.pack_num - это поле целого числа типа. Это означает, что когда я пытаюсь получить доступ к нему, если это добулль, я получаю сильнеетыпендифицированное примечание. Вышеуказанный код бросает это исключение. Если, однако, я удаляю «invReCord.pack_num = PSnum», а на его месте положил что-то вроде «правда», код работает нормально.
Так что я думаю, что мой вопрос, почему в том, что invrecord.ispack_numnull () возвращает false, когда значение на самом деле dbnull и что я могу использовать в качестве условного вместо этого? Я немного избил голову к стене сейчас, и я не могу найти решение этой проблемы.
Решение
В vb.net, IIf()
Оценивает каждый из своих аргументов, поскольку это функция, а не языковое заявление. Так inv.Record.Pack_Num = PSNum
всегда будет оцениваться.
Вы можете использовать If()
вместо IIf()
(тот же синтаксис), который использует оценку короткого замыкания, поэтому все будет работать, как ожидалось.
На боковом узле, будьте осторожны с And
а также Or
которые имеют одинаковое поведение. Использовать AndAlso
а также OrElse
Вместо этого, если вам нужна оценка короткого замыкания.