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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top