質問

次の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の場合、私はstringlytypedexceptionを取得することを意味します。上記のコードはこの例外をスローします。ただし、「invrecord.pack_num = psnum」を削除し、その場所で「true」のようなものを置くと、コードは正常に動作します。

だから私の質問は、そのinvrecord.ispack_numnull()が実際にdbnullである場合にfalseを返すのはなぜですか?代わりに条件として何を使用できますか?私はしばらくの間、頭を壁に打ち負かしていましたが、この問題の解決策が見つかりません。

役に立ちましたか?

解決

vb.netで、 IIf() それは言語声明ではなく関数であるため、その議論のすべてを評価します。それで inv.Record.Pack_Num = PSNum 常に評価されます。

使用できます If() それ以外の IIf() (同じ構文)短絡評価を使用するため、すべてが予想どおりに機能します。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top