Comment puis-je interroger des valeurs null dans le cadre de l'entité?

.net ado.net entity-framework

Question

Je veux exécuter une requête comme celle-ci

   var result = from entry in table
                     where entry.something == null
                     select entry;

et obtenir un IS NULL généré.

Édité: 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 en EF.

Edit no.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, elle la traite comme une comparaison normale. Fait sens en fait. Je vais fermer cette question

Réponse acceptée

Solution de contournement pour Linq-to-SQL:

var result = from entry in table
             where entry.something.Equals(value)
             select entry;

Solution de contournement pour Linq to Entities (ouch!):

var result = from entry in table
             where (value == null ? entry.something == null : entry.something == value)
             select entry;

C'est un méchant insecte qui m'a mordu plusieurs fois. Si ce bogue vous a également affecté, veuillez consulter le rapport de bogue sur UserVoice et informer Microsoft que ce bogue vous a également affecté.


Edit: Ce bogue est corrigé dans EF 4.5 ! Merci à tous d'avoir voté pour ce bug!

Pour assurer la compatibilité avec les versions antérieures, le système sera activé. Vous devez activer manuellement un paramètre pour que la entry == value . Aucun mot sur ce que ce paramètre est encore. Restez à l'écoute!


Edit 2: Selon ce billet de l'équipe EF, ce problème a été résolu dans EF6! Woohoo!

Nous avons modifié le comportement par défaut de EF6 pour compenser la logique à trois valeurs.

Cela signifie que le code existant qui s'appuie sur l'ancien comportement ( null != null , mais uniquement lors de la comparaison avec une variable) devra soit être modifié pour ne plus dépendre de ce comportement, soit définir UseCSharpNullComparisonBehavior sur false pour utiliser l'ancien comportement endommagé.


Réponse populaire

Depuis Entity Framework 5.0, vous pouvez utiliser le code suivant pour résoudre votre problème:

public abstract class YourContext : DbContext
{
  public YourContext()
  {
    (this as IObjectContextAdapter).ObjectContext.ContextOptions.UseCSharpNullComparisonBehavior = true;
  }
}

Cela devrait résoudre vos problèmes car Entity Framerwork utilisera la comparaison null 'C # like'.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow