VB.Net Linq to entities Null Comparaison - "n'Est Rien" ou "= Rien"?
Nous avons plusieurs projets en VB.Net, à l'aide de .Net Framework 4 et Linq to entities pour beaucoup de nos requêtes SQL. Le déplacement à EF est un nouveau tournant pour nous (utilisé pendant environ 4 à 6 mois) et a le soutien de la haute direction, parce que nous pouvons le code beaucoup plus vite. Il y a encore beaucoup d'stockées procs, mais nous même exécuter par Linq to entities.
Je suis l'espoir d'effacer une certaine confusion et je ne peux pas trouver une réponse directe, qui fait sens. Nous avons certaines requêtes où nous voulons les enregistrements où le champ a une valeur NULL. Ce sont de simples requêtes de sélection, pas d'agrégats ou de gauche rejoint, etc. Microsoft recommande la requête ressembler à quelque chose comme ceci MSDN Lien:
dim query = from a in MyContext.MyTables
Where a.MyField = Nothing
Select a
J'ai plusieurs projets sur lesquels je faire exactement cela et il fonctionne très bien, pas de mises en garde dans l'IDE. Récemment, un nouveau projet a été créé par un autre développeur et quand il a fait ses null case comme ci-dessus, nous avons tous cet avertissement dans l'IDE:
Avertissement 1 Cette expression sera toujours évaluer à Rien (en raison de la valeur null propagation de l'opérateur=). Pour vérifier si la valeur est null envisager d'utiliser 'n'Est Rien".
En comparant les projets, l'option explicite et option strict de chacun. Si l'on ignore l'avertissement, à nous de trouver le jeu d'enregistrements que nous recherchons lorsque l'application s'exécute. L'avertissement disparaît si je change le signe = EST. Mais pourquoi cet avertissement apparaît dans un projet et pas d'autres? C'est déroutant quand même sur MSDN il y a des exemples à l'aide de l'opérateur=.
Equals
mot-clé. Je n'ai pas de moyen de le tester, mais peut-être essayer ça à la place? Where a.MyField Equals Nothing
C'est un mot-clé contextuel qui est utilisé dans
Join
clauses (autant que je sache). Je ne pense pas que vous pouvez l'utiliser n'importe où ailleurs.OriginalL'auteur | 2012-07-10
Vous devez vous connecter pour publier un commentaire.
Je crois que ce que vous voyez ici est que
MyField
est unNullable(Of T)
type. Probablement une primitiveInteger
,Single
, etc ...La raison pour laquelle vous voyez cet avertissement est que le compilateur favorise la normale opérateur d'égalité pour le type primitif de la
Nullable(Of T)
version. Essentiellement, il s'exécute à la suite deLe problème c'est que quand
Integer?
a la valeurNothing
il ne comparez pas égal à rien. D'où le ci-dessusWhere
clause retournera toujoursFalse
. Le compilateur est de tenter de vous avertir de ce coin problématique deNullable(Of T)
et vous pousser à uneIs Nothing
vérifier ce qui permettra de déterminer sia.MyField
a une valeur non nulle.Cet article de blog a un très explication détaillée des raisons de cet avertissement est généré et l'ensemble de la mécanique derrière elle. L'article est écrit en C#, mais le principe de base est applicable à VB.Net ainsi.
correct. Normalement, vous pouvez utiliser
=
avec un nullable valeur. La comparaison avecNothing
si retournera toujoursFalse
bien que si le compilateur émet un avertissement à ce sujetJouer avec un peu plus, je peux le faire = Rien pour les champs de type chaîne qui sont les valeurs null dans la base de données, mais pas les autres types de données et vous pouvez utiliser n'Est Rien ou du HasValue membre qui Afshin mentionné. Merci pour un peu de lumière sur cette.
OriginalL'auteur JaredPar
Généré colonne doit être un
Nullable(Of T)
De sorte que vous pouvez vérifier si le champ a ou non une valeur comme ceci:
OriginalL'auteur Afshin Gh
Au moins dans LINQ to objects, vous pouvez utiliser ce lieu:
Cela fonctionne très bien avec les deux, ou aucun des deux valeurs étant Rien.
OriginalL'auteur Ronny Heuschkel