Проблема с DBNull при использовании LINQ to DataSet - PullRequest
0 голосов
/ 21 мая 2010

У меня есть следующее утверждение 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 - это поле типа Integer. Это означает, что когда я пытаюсь получить к нему доступ, если это DBNull, я получаю StronglyTypedException. Приведенный выше код вызывает это исключение. Если, однако, я удаляю «invRecord.Pack_Num = PSNum» и на его место ставлю что-то вроде «True», код работает нормально.

Итак, я предполагаю, что мой вопрос таков: почему этот invRecord.IsPack_NumNull () возвращает False, когда значение фактически DBNull и что я могу использовать вместо него как условное? Я уже некоторое время бьюсь головой о стену и не могу найти решение этой проблемы.

1 Ответ

1 голос
/ 21 мая 2010

В VB.NET IIf() оценивает каждый из своих аргументов, поскольку это функция, а не оператор языка. Так что inv.Record.Pack_Num = PSNum всегда будет оцениваться.

Вы можете использовать If() вместо IIf() (тот же синтаксис), который использует оценку короткого замыкания, поэтому все будет работать, как ожидалось.

На боковом узле будьте осторожны с And и Or, которые ведут себя одинаково. Используйте AndAlso и OrElse вместо этого, если вам нужна оценка короткого замыкания.

...