Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warum generiert EF SQL-Abfragen mit unnötigen Nullprüfungen?

Setzen Sie UseDatabaseNullSemantics = true;

  • Wenn UseDatabaseNullSemantics == true , (operand1 == operand2) wird übersetzt als:

    WHERE operand1 = operand2
    
  • Wenn UseDatabaseNullSemantics == false , (operand1 == operand2) wird übersetzt als:

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

Dies ist von Microsoft dokumentiert:

Ruft einen Wert ab oder legt einen Wert fest, der angibt, ob beim Vergleich zweier Operanden, die beide potenziell nullfähig sind, Datenbank-Nullsemantik gezeigt wird. Der Standardwert ist falsch.

Sie können es in Ihrem DbContext festlegen Unterklassenkonstruktor, etwa so:

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

Oder Sie können diese Einstellung auch auf Ihren dbContext setzen Instanz von außen wie im folgenden Codebeispiel, aus meiner Sicht (siehe @GertArnold-Kommentar) ist dieser Ansatz besser, da er das Standardverhalten oder die Konfiguration der Datenbank nicht ändert):

myDbContext.Configuration.UseDatabaseNullSemantics = true;