Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Perché EF genera query SQL con controlli null non necessari?

Imposta UseDatabaseNullSemantics = true;

  • Quando UseDatabaseNullSemantics == true , (operand1 == operand2) sarà tradotto come:

    WHERE operand1 = operand2
    
  • Quando UseDatabaseNullSemantics == false , (operand1 == operand2) sarà tradotto come:

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

Questo è documentato da Microsoft:

Ottiene o imposta un valore che indica se la semantica Null del database viene visualizzata quando si confrontano due operandi, entrambi potenzialmente annullabili. Il valore predefinito è false.

Puoi impostarlo nel tuo DbContext costruttore di sottoclassi, in questo modo:

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

Oppure puoi anche impostare questa impostazione sul tuo dbContext istanza dall'esterno come l'esempio di codice qui sotto, dal mio punto di vista (vedi il commento di @GertArnold), questo approccio sarà migliore, perché non cambierà il comportamento o la configurazione del database predefinito):

myDbContext.Configuration.UseDatabaseNullSemantics = true;