sql >> Base de Datos >  >> RDS >> Sqlserver

¿Por qué EF genera consultas SQL con comprobaciones nulas innecesarias?

Establecer UseDatabaseNullSemantics = true;

  • Cuando UseDatabaseNullSemantics == true , (operand1 == operand2) se traducirá como:

    WHERE operand1 = operand2
    
  • Cuando UseDatabaseNullSemantics == false , (operand1 == operand2) se traducirá como:

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

Esto está documentado por Microsoft:

Obtiene o establece un valor que indica si la semántica nula de la base de datos se muestra al comparar dos operandos, ambos potencialmente anulables. El valor predeterminado es falso.

Puede configurarlo en su DbContext constructor de subclase, así:

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

O también puede establecer esta configuración en su dbContext instancia desde el exterior como el ejemplo de código a continuación, desde mi punto de vista (vea el comentario de @GertArnold), este enfoque será mejor, porque no cambiará el comportamiento o la configuración predeterminados de la base de datos):

myDbContext.Configuration.UseDatabaseNullSemantics = true;