0

次の 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 は整数型のフィールドです。これは、アクセスしようとすると、DBNull の場合、StronglyTypedException が発生することを意味します。上記のコードは、この例外をスローします。ただし、「invRecord.Pack_Num = PSNum」を削除し、代わりに「True」などを配置すると、コードは正常に機能します。

だから私の質問は、値が実際には DBNull であるのに invRecord.IsPack_NumNull() が False を返すのはなぜですか?代わりに条件として何を使用できるのでしょうか? 私はしばらく壁に頭をぶつけていましたが、この問題の解決策が見つかりません。

4

1 に答える 1

1

VB.NETでは、IIf()これは関数であり、言語ステートメントではないため、すべての引数を評価します。したがってinv.Record.Pack_Num = PSNum、常に評価されます。

短絡評価を使用する(同じ構文)If()の代わりに使用できるため、すべてが期待どおりに機能します。IIf()

サイドノードでは、同じ動作をすることに注意してAndください。短絡評価が必要な場合は、代わりにをOr使用してください。AndAlsoOrElse

于 2010-05-20T22:10:23.417 に答える