sql >> Databáze >  >> RDS >> Sqlserver

Proč EF generuje SQL dotazy se zbytečnými kontrolami null?

Nastavte UseDatabaseNullSemantics = true;

  • Když UseDatabaseNullSemantics == true , (operand1 == operand2) bude přeloženo jako:

    WHERE operand1 = operand2
    
  • Když UseDatabaseNullSemantics == false , (operand1 == operand2) bude přeloženo jako:

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

Toto je zdokumentováno společností Microsoft:

Získává nebo nastavuje hodnotu, která označuje, zda se při porovnávání dvou operandů, z nichž oba mohou potenciálně nulovat, projeví sémantika null databáze. Výchozí hodnota je false.

Můžete to nastavit ve vašem DbContext konstruktor podtřídy, třeba takto:

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

Nebo můžete toto nastavení také nastavit na váš dbContext instance zvenčí, jako je příklad kódu níže, z mého pohledu (viz komentář @GertArnold) bude tento přístup lepší, protože nezmění výchozí chování nebo konfiguraci databáze):

myDbContext.Configuration.UseDatabaseNullSemantics = true;


  1. Funkce NLSSORT() v Oracle

  2. Jaký dopad mohou mít různé možnosti kurzoru?

  3. Dell Boomi

  4. Aktualizujte data aktivity ze služby, když je pozastavena