Problème avec DBNull lors de l'utilisation LINQ à DataSet
-
04-10-2019 - |
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.
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.