Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Por que o EF está gerando consultas SQL com verificações nulas desnecessárias?


Defina UseDatabaseNullSemantics = true;

  • Quando UseDatabaseNullSemantics == true , (operand1 == operand2) será traduzido como:
    WHERE operand1 = operand2
    

  • Quando UseDatabaseNullSemantics == false , (operand1 == operand2) será traduzido como:
    WHERE
        (
            (operand1 = operand2)
            AND
            (NOT (operand1 IS NULL OR operand2 IS NULL))
        )
        OR
        (
            (operand1 IS NULL)
            AND
            (operand2 IS NULL)
        )
    

Isso é documentado pela Microsoft:

Obtém ou define um valor que indica se a semântica nula do banco de dados é exibida ao comparar dois operandos, ambos potencialmente anuláveis. O valor padrão é falso.

Você pode configurá-lo em seu DbContext construtor de subclasse, assim:
public class MyContext : DbContext
{
    public MyContext()
    {
        this.Configuration.UseDatabaseNullSemantics = true;
    }
}

Ou você também pode definir essa configuração para seu dbContext instância externa como o exemplo de código abaixo, do meu ponto de vista (veja o comentário @GertArnold), essa abordagem será melhor, pois não alterará o comportamento ou a configuração padrão do banco de dados):
myDbContext.Configuration.UseDatabaseNullSemantics = true;