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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top