Domanda

Ho la seguente dichiarazione 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 è un campo di tipo Integer. Ciò significa che quando provo ad accedere, se è DBNull ho uno StronglyTypedException. Il codice di cui sopra genera questa eccezione. Se, tuttavia, rimuovo "invRecord.Pack_Num = PSNum" e al suo posto mettere qualcosa come "True", il codice funziona bene.

Quindi credo che la mia domanda è, perché è quello che invRecord.IsPack_NumNull () restituisce False quando il valore è infatti DBNull e che cosa posso usare come invece un condizionale? Sto battendo la testa contro il muro per un po 'di tempo e non riesco a trovare una soluzione a questo problema.

È stato utile?

Soluzione

In VB.NET, IIf() valuta ogni uno dei suoi argomenti dal momento che è una funzione, non una dichiarazione lingua. Così sarà sempre valutata inv.Record.Pack_Num = PSNum.

È possibile utilizzare al posto di If() IIf() (stessa sintassi), che utilizza la valutazione di corto circuito in modo tutto funzionerà come previsto.

Su un nodo lato, attenti con And e Or che hanno lo stesso comportamento. Usa AndAlso e OrElse invece se avete bisogno di valutazione corto circuito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top