Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dlaczego EF generuje zapytania SQL z niepotrzebnymi kontrolami wartości null?

Ustaw UseDatabaseNullSemantics = true;

  • Gdy UseDatabaseNullSemantics == true , (operand1 == operand2) zostanie przetłumaczone jako:

    WHERE operand1 = operand2
    
  • Gdy UseDatabaseNullSemantics == false , (operand1 == operand2) zostanie przetłumaczone jako:

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

Jest to udokumentowane przez Microsoft:

Pobiera lub ustawia wartość wskazującą, czy podczas porównywania dwóch operandów, z których oba potencjalnie dopuszczają wartość null, występuje semantyka bazy danych o wartości null. Domyślna wartość to false.

Możesz to ustawić w swoim DbContext Konstruktor podklas, na przykład:

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

Możesz też ustawić to ustawienie na swój dbContext instancja z zewnątrz jak przykład kodu poniżej, z mojego punktu widzenia (patrz komentarz @GertArnold), to podejście będzie lepsze, ponieważ nie zmieni domyślnego zachowania ani konfiguracji bazy danych):

myDbContext.Configuration.UseDatabaseNullSemantics = true;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak używać usuwania kaskadowego w programie SQL Server?

  2. RODBC odbcDriverConnect() Błąd połączenia

  3. Dodawanie wskazówki do zapytania podczas wywoływania funkcji z wartościami tabelowymi

  4. Jak zmienić domyślny język dla SQL Server?

  5. Czy istnieje odpowiednik SELECT... INTO OUTFILE w SQL Server Management Studio?