Geben Sie mit DBNull, wenn LINQ to DataSet mit
-
04-10-2019 - |
Frage
Ich habe die folgende LINQ-Anweisung bekommen:
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 ist ein Feld vom Typ Integer. Dies bedeutet, dass, wenn ich versuche, darauf zuzugreifen, wenn es DBNull erhalte ich eine StronglyTypedException ist. Der obige Code führt diese Ausnahme. Wenn jedoch entferne ich die „invRecord.Pack_Num = PSNum“ und in seinem Platz so etwas wie „True“, funktioniert der Code in Ordnung.
Also ich meine Frage erraten ist, warum ist das so, dass invRecord.IsPack_NumNull () gibt Falsch, wenn der Wert in der Tat DBNull ist und was kann ich als bedingter verwenden stattdessen? Ich habe für eine Weile jetzt meinen Kopf gegen die Wand zu schlagen worden und ich kann nicht eine Lösung für dieses Problem finden.
Lösung
In VB.NET, wertet IIf()
jeden seiner Argumente, da es eine Funktion ist, keine Sprache Aussage. So inv.Record.Pack_Num = PSNum
wird immer ausgewertet werden.
Sie können If()
statt IIf()
(gleiche Syntax) verwendet werden, die Kurzschlussauswertung verwendet, so dass alles funktioniert wie erwartet.
Auf einer Seite Knoten, seien Sie vorsichtig mit And
und Or
, die das gleiche Verhalten. Verwenden AndAlso
und OrElse
statt, wenn Sie benötigen Kurzschlussauswertung.