Comment pouvez-j'ai une requête pour des valeurs nulles dans le cadre de l'entité?
Je veux exécuter une requête de ce
var result = from entry in table
where entry.something == null
select entry;
et obtenir une IS NULL
généré.
Modifié:
Après les deux premières réponses, je ressens le besoin de préciser que je suis en utilisant Entity Framework
et pas Linq to SQL. L'objet.Méthode Equals() ne semble pas fonctionner dans les EF.
Modifier no.2:
La requête ci-dessus fonctionne comme prévu. Il génère correctement IS NULL
. Mon code de production a toutefois été
value = null;
var result = from entry in table
where entry.something == value
select entry;
et le SQL généré est something = @p; @p = NULL
. Il semble que EF traduit correctement l'expression constante, mais si une variable est impliquée, il le traite comme une comparaison. De sens en fait. Je vais fermer cette question
- Je crois qu'il n'a pas vraiment de sens... Le connecteur doit être un peu plus intelligent et ne pas nous demander de faire son travail : effectuer une traduction correcte en SQL de corriger C# requête. Cela génère un comportement imprévu.
- Je suis avec Julien, c'est un échec de la part de l'EF
- C'est un échec, les normes, et les choses ne font qu'empirer maintenant que la comparaison avec la valeur null est définitivement entraînant pas défini en tant que de SQL Server 2016 avec ANSI Null définitivement réglé sur on. Null peut représenter une valeur inconnue, mais "null" lui-même n'est pas une valeur inconnue. La comparaison d'une valeur nulle à une valeur null doit absolument rendement vrai, mais malheureusement, la norme s'écarte de bon sens et de la logique Booléenne.
Vous devez vous connecter pour publier un commentaire.
Solution de contournement pour Linq-to-SQL:
Solution de contournement pour Linq-to-Entités (aïe!):
C'est un méchant bug qui m'a mordu à plusieurs reprises.
Si ce bug a affecté vous aussi, veuillez visiter le rapport de bug sur UserVoice et permettre à Microsoft de savoir que ce bug a touché vous-même.Edit: Ce bug est en cours de correction en EF 4.5! Merci à tous pour upvoting ce bug!
Pour la compatibilité ascendante, il sera opt-dans - vous besoin d'activer manuellement un réglage à faire
entry == value
travail. Aucun mot encore sur ce réglage. Restez à l'écoute!Edit 2: Selon ce post par 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 seulement lorsque l'on compare à une variable) devront soit être changé de ne pas s'appuyer sur ce comportement, ou un ensembleUseCSharpNullComparisonBehavior
à false pour utiliser l'ancien comportement défectueux.(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))
Object.Equals
méthode? Je n'étais même pas au courant qu'avait été édité dans la réponse...Depuis Entity Framework 5.0, vous pouvez utiliser le code suivant afin de résoudre votre problème:
Ce qui devrait résoudre vos problèmes comme Entité Framerwork va utiliser 'C# comme" nulle comparaison.
Il est un peu plus simple solution de contournement qui fonctionne avec LINQ to entities:
Cela fonctionne becasuse, comme AZ remarqué, LINQ to entities cas spéciaux x == null (c'est à dire une comparaison d'égalité contre la constante null) et la convertit en x EST NULLE.
Nous envisageons actuellement de modifier ce comportement pour introduire la compensation des comparaisons automatiquement si les deux côtés de l'égalité sont des valeurs null. Il ya un couple de défis:
Dans tous les cas, si nous arrivons à travailler sur cela va dépendre grandement de la priorité relative accordée à nos clients de lui attribuer. Si vous vous souciez de la question, je vous encourage à voter pour elle dans notre nouvelle Fonctionnalité de Suggestion de site: https://data.uservoice.com.
Si c'est un type nullable, peut-être essayer d'utiliser la propriété HasValue?
N'ont pas d'EF pour tester sur ici, mais... juste une suggestion =)
== null
ne pas être touché par le bug de toute façon. Le point est le filtrage par la valeur d'une variable, dont la valeur peut être nulle, et ont la valeur null trouver les enregistrements null.(x => x.Column == null)
de travail. 🙂Référence MSDN: LINQ to SQL: .NET Language-Integrated Query de Données Relationnelles
à traiter avec la valeur Null Comparaisons utilisation
Object.Equals()
au lieu de==
cochez cette référence
De noter que toutes les Entity Framework < 6.0 suggestions générer certains maladroits SQL. Voir le deuxième exemple pour "nettoyer" fix.
Ridicule Solution De Contournement
résultats dans SQL comme:
Scandaleux Solution De Contournement
Si vous voulez générer plus propre SQL, quelque chose comme:
résultats dans ce que tu voulais en premier lieu:
La requête ci-dessus fonctionne comme prévu. Il génère correctement EST NULL. Mon code de production a toutefois été
et le SQL généré est quelque chose = @p @p = NULL. Il semble que EF traduit correctement l'expression constante, mais si une variable est impliquée, il le traite comme une comparaison. De sens en fait.
Il semble que Linq2Sql a ce "problème" ainsi. Il semble qu'il y a une raison valable à ce problème en raison de si ANSI Null ou non, mais cela dépasse l'entendement pourquoi un droit "== null" sera en fait le travail comme vous le souhaitez.
Personnellement, je préfère:
sur
parce qu'elle empêche la répétition, mais ce n'est pas mathématiquement exact, mais il s'inscrit bien dans la plupart des cas.
Je ne suis pas en mesure de commenter divega post, mais parmi les différentes solutions présentées ici, divega la solution de produit le meilleur SQL. Performance sage et la longueur de la sagesse. Je viens de vérifier avec le générateur de profils SQL Server et en regardant le plan d'exécution (avec "DÉFINIR le PROFIL de STATISTIQUES SUR l'").
Malheureusement dans l'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 ANSI NULL paramètre peut être déconseillé dans toute future MSSQL version).
Il convient de noter que c'est un sale solution de contournement mais il est celui qui peut être mis en œuvre très rapidement et fonctionne pour toutes les requêtes.
Si vous préférez l'aide de la méthode (lambda) de la syntaxe comme je le fais, vous pourriez faire la même chose comme ceci:
utiliser que