Problema con DBNull quando si utilizza LINQ to DataSet
-
04-10-2019 - |
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.
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.