Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi EF génère-t-il des requêtes SQL avec des vérifications nulles inutiles ?

Définissez UseDatabaseNullSemantics = true;

  • Lorsque UseDatabaseNullSemantics == true , (operand1 == operand2) sera traduit par :

    WHERE operand1 = operand2
    
  • Lorsque UseDatabaseNullSemantics == false , (operand1 == operand2) sera traduit par :

    WHERE
        (
            (operand1 = operand2)
            AND
            (NOT (operand1 IS NULL OR operand2 IS NULL))
        )
        OR
        (
            (operand1 IS NULL)
            AND
            (operand2 IS NULL)
        )
    

Ceci est documenté par Microsoft :

Obtient ou définit une valeur indiquant si la sémantique nulle de la base de données est affichée lors de la comparaison de deux opérandes, qui sont tous deux potentiellement nullables. La valeur par défaut est faux.

Vous pouvez le définir dans votre DbContext constructeur de sous-classe, comme ceci :

public class MyContext : DbContext
{
    public MyContext()
    {
        this.Configuration.UseDatabaseNullSemantics = true;
    }
}

Ou vous pouvez également définir ce paramètre sur votre dbContext instance de l'extérieur comme l'exemple de code ci-dessous, de mon point de vue (voir le commentaire de @GertArnold), cette approche sera meilleure, car elle ne changera pas le comportement ou la configuration de la base de données par défaut :

myDbContext.Configuration.UseDatabaseNullSemantics = true;