Problemas con las DBNull al utilizar LINQ to DataSet
-
04-10-2019 - |
Pregunta
Tengo la siguiente Declaración de 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 es un campo de tipo entero. Esto significa que cuando intento acceder a ella, si es DBNull consigo un StronglyTypedException. El código anterior lanza esta excepción. Sin embargo, si se quita la "invRecord.Pack_Num = psNum" y en su lugar poner algo como "True", el código funciona bien.
Así que supongo que mi pregunta es, ¿por qué será que invRecord.IsPack_NumNull () devuelve False cuando el valor es de hecho DBNull y lo que puedo usar como un condicional en su lugar? He estado golpeando mi cabeza contra la pared durante un tiempo y ahora no puedo encontrar una solución a este problema.
Solución
En VB.NET, IIf()
evalúa cada uno de sus argumentos, ya que es una función, no es una sentencia de lenguaje. Por lo que siempre será evaluado inv.Record.Pack_Num = PSNum
.
Se puede utilizar en lugar de If()
IIf()
(misma sintaxis), que utiliza la evaluación cortocircuitando así que todo funcionará como se espera.
En un nodo lado, tenga cuidado con And
y Or
que tienen el mismo comportamiento. Uso AndAlso
y OrElse
lugar si necesitan una evaluación de cortocircuito.