2010-05-20 23 views
0

J'ai la déclaration LINQ suivante:Problème avec DBNull lors de l'utilisation LINQ à DataSet

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 j'essaie d'y accéder, si c'est DBNull, j'obtiens une exception StronglyTypedException. Le code ci-dessus renvoie cette exception. Si, cependant, je supprime le "invRecord.Pack_Num = PSNum" et à sa place mettre quelque chose comme "True", le code fonctionne bien.

Donc, 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 conditionnel à la place? Je me suis cogné la tête contre le mur pendant un moment et je ne trouve pas de solution à ce problème.

Répondre

1

Dans VB.NET, IIf() évalue chacun de ses arguments puisqu'il s'agit d'une fonction et non d'une instruction de langage. Donc inv.Record.Pack_Num = PSNum sera toujours évalué.

Vous pouvez utiliser If() au lieu de IIf() (même syntaxe) qui utilise l'évaluation de court-circuit pour que tout fonctionne comme prévu.

Sur un nœud latéral, faites attention à And et Or qui ont le même comportement. Utilisez AndAlso et OrElse à la place si vous avez besoin d'une évaluation de court-circuit.

+0

Ouais, vous aviez raison. Je ne sais pas comment j'ai raté ça, mais je pensais que c'était l'inverse. Intuitivement, j'ai toujours pensé que IIf signifiait quelque chose comme «Si et seulement si», ce qui impliquerait ce comportement de «court-circuit» que je voulais. Quoi qu'il en soit, merci beaucoup. – Overhed

+0

Je suppose que l'équipe de langue VB voulait dire "inline if". –