Question

J'ai la déclaration de LINQ suivante:

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 est un champ de type entier. Cela signifie que lorsque je tente d'y accéder, si elle est DBNull je reçois un StronglyTypedException. Le code ci-dessus génère cette exception. Cependant, si je retire la « invRecord.Pack_Num = PSNum » et à sa place mettre quelque chose comme « True », le code fonctionne très bien.

Je suppose que ma question est, pourquoi est-ce que invRecord.IsPack_NumNull () renvoie False lorsque la valeur est en fait DBNull et que puis-je utiliser comme condition à la place? J'ai battais ma tête contre le mur pendant un certain temps maintenant et je ne peux pas trouver une solution à ce problème.

Était-ce utile?

La solution

Dans VB.NET, IIf() évalue chacun de ses arguments car il est une fonction, pas une déclaration de langue. Donc inv.Record.Pack_Num = PSNum sera toujours évaluée.

Vous pouvez utiliser If() au lieu de IIf() (même syntaxe) qui utilise l'évaluation à court-circuiter donc tout fonctionnera comme prévu.

Sur un nœud côté, soyez prudent avec And et Or qui ont le même comportement. Utilisez AndAlso et OrElse au lieu si vous avez besoin d'évaluation court-circuit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top