sql >> Databasteknik >  >> RDS >> Sqlserver

Varför genererar EF SQL-frågor med onödiga nollkontroller?

Ställ in UseDatabaseNullSemantics = true;

  • När UseDatabaseNullSemantics == true , (operand1 == operand2) kommer att översättas som:

    WHERE operand1 = operand2
    
  • När UseDatabaseNullSemantics == false , (operand1 == operand2) kommer att översättas som:

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

Detta är dokumenterat av Microsoft:

Hämtar eller ställer in ett värde som indikerar om databas noll-semantik visas när två operander jämförs, som båda är potentiellt nollbara. Standardvärdet är falskt.

Du kan ställa in den i din DbContext underklasskonstruktor, som så:

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

Eller så kan du också ställa in den här inställningen till din dbContext instans från utsidan som kodexemplet nedan, ur min synvinkel (se @GertArnold-kommentaren), kommer detta tillvägagångssätt att vara bättre, eftersom det inte kommer att ändra standarddatabasbeteendet eller -konfigurationen):

myDbContext.Configuration.UseDatabaseNullSemantics = true;


  1. Så här ändrar du lagringsperiod för ändring av datainsamling (CDC) i SQL Server - självstudiekurs för SQL Server

  2. Guide till designdatabas för lagerhanteringssystem i MySQL

  3. En affärsdatamodell för prenumeration

  4. Postgres:INFOGA om det inte redan finns