Проблема с dbnull при использовании linq к набору данных

StackOverflow https://stackoverflow.com/questions/2878074

Вопрос

У меня есть следующее утверждение 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 Вместо этого, если вам нужна оценка короткого замыкания.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top