Je veux exécuter une requête comme celle-ci
var result = from entry in table
where entry.something == null
select entry;
et obtenez un IS NULL
fichier généré.
Modifié: Après les deux premières réponses, je ressens le besoin de préciser que j'utilise Entity Framework et non Linq to SQL. La méthode object.Equals () ne semble pas fonctionner dans EF.
Edit n ° 2: La requête ci-dessus fonctionne comme prévu. Il génère correctement IS NULL
. Mon code de production était cependant
value = null;
var result = from entry in table
where entry.something == value
select entry;
et le SQL généré était something = @p; @p = NULL
. Il semble que EF traduit correctement l'expression constante, mais si une variable est impliquée, il la traite comme une comparaison normale. Cela a du sens en fait. Je clore cette question
.net
entity-framework
ado.net
Adrian Zanescu
la source
la source
Réponses:
Solution de contournement pour Linq-to-SQL:
Solution de contournement pour Linq-to-Entities (aïe!):
C'est un vilain bogue qui m'a mordu plusieurs fois.
Si ce bogue vous a également affecté, consultez le rapport de bogue sur UserVoice et faites savoir à Microsoft que ce bogue vous a également affecté.Edit: Ce bogue est en cours de correction dans EF 4.5 ! Merci à tous d'avoir voté pour ce bogue!
Pour la compatibilité ascendante, ce sera opt-in - vous devez activer manuellement un paramètre pour
entry == value
fonctionner. Aucun mot pour le moment sur ce paramètre. Restez à l'écoute!Edit 2: Selon cet article de l'équipe EF, ce problème a été corrigé dans EF6! Woohoo!
Cela signifie que le code existant qui repose sur l'ancien comportement (
null != null
mais uniquement lors de la comparaison à une variable) devra soit être modifié pour ne pas s'appuyer sur ce comportement, soit définiUseCSharpNullComparisonBehavior
sur false pour utiliser l'ancien comportement cassé.la source
(var result = from ...; if(value.HasValue) result = result.Where(e => e.something == value) else result = result.Where(e => e.something == null);
(where Object.Equals(entry.something,value))
Depuis Entity Framework 5.0, vous pouvez utiliser le code suivant pour résoudre votre problème:
Cela devrait résoudre vos problèmes car Entity Framerwork utilisera la comparaison nulle «C # like».
la source
Il existe une solution de contournement légèrement plus simple qui fonctionne avec LINQ to Entities:
Cela fonctionne parce que, comme AZ l'a remarqué, LINQ to Entities des cas spéciaux x == null (c'est-à-dire une comparaison d'égalité avec la constante nulle) et le traduit en x IS NULL.
Nous envisageons actuellement de changer ce comportement pour introduire automatiquement les comparaisons de compensation si les deux côtés de l'égalité sont nullables. Il y a cependant quelques défis:
Dans tous les cas, la question de savoir si nous y parvenons dépendra grandement de la priorité relative que nos clients lui attribueront. Si vous vous souciez du problème, je vous encourage à voter pour celui-ci sur notre nouveau site de suggestions de fonctionnalités: https://data.uservoice.com .
la source
S'il s'agit d'un type Nullable, essayez peut-être d'utiliser la propriété HasValue?
Cependant, je n'ai pas d'EF à tester ici ... juste une suggestion =)
la source
== null
ne soit pas touchée par le bogue de toute façon. Le point est de filtrer par la valeur d'une variable, dont la valeur peut être nulle, et que la valeur nulle trouve les enregistrements nuls.(x => x.Column == null)
fonctionner. :)System.NullReferenceException
, puisque l'objet est déjà nul!Référence MSDN : LINQ to SQL: requête intégrée au langage .NET pour les données relationnelles
la source
pour gérer les comparaisons nulles utiliser
Object.Equals()
au lieu de==
vérifier cette référence
la source
null
,Object.Equals(null)
, si leObject
lui - même est nul?Soulignant que toutes les suggestions Entity Framework <6.0 génèrent du SQL gênant. Voir le deuxième exemple pour un correctif "propre".
Solution de contournement ridicule
résultats en SQL comme:
Solution de contournement scandaleuse
Si vous souhaitez générer du SQL plus propre, quelque chose comme:
donne ce que vous vouliez en premier lieu:
la source
La requête ci-dessus fonctionne comme prévu. Il génère correctement IS NULL. Mon code de production était cependant
et le SQL généré était quelque chose = @p; @p = NULL. Il semble que EF traduit correctement l'expression constante, mais si une variable est impliquée, il la traite comme une comparaison normale. Cela a du sens en fait.
la source
Il semble que Linq2Sql ait également ce "problème". Il semble qu'il y ait une raison valable à ce comportement en raison du fait que les ANSI NULL sont activés ou désactivés, mais il est stupéfiant de savoir pourquoi un simple "== null" fonctionnera en fait comme prévu.
la source
Personnellement, je préfère:
plus de
car cela empêche la répétition - bien que ce ne soit pas mathématiquement exact, mais cela convient bien à la plupart des cas.
la source
Je ne suis pas en mesure de commenter l'article de divega, mais parmi les différentes solutions présentées ici, la solution de divega produit le meilleur SQL. À la fois en termes de performances et de longueur. Je viens de vérifier avec SQL Server Profiler et en regardant le plan d'exécution (avec "SET STATISTICS PROFILE ON").
la source
Malheureusement, dans Entity Framework 5 DbContext, le problème n'est toujours pas résolu.
J'ai utilisé cette solution de contournement (fonctionne avec MSSQL 2012 mais le paramètre ANSI NULLS peut être obsolète dans toute version future de MSSQL).
Il convient de noter que c'est une solution de contournement sale mais qui peut être implémentée très rapidement et qui fonctionne pour toutes les requêtes.
la source
Si vous préférez utiliser la syntaxe de méthode (lambda) comme je le fais, vous pouvez faire la même chose comme ceci:
la source
Utiliser ça
la source