LINQ создает дополнительное условие IS NULL в выражении SQL - PullRequest
0 голосов
/ 21 мая 2018

Я пишу несколько LINQ для выборки записей, основанных на электронной почте, однако сгенерированный SQL содержит дополнительное условие IS NULL, которого не должно быть, потому что я проверяю значение параметра для нуля в предыдущем кодедля добавления условия в запрос.

Мой код LINQ:

if (email != null)
{
    query = query.Where(r => r.Email == email);
}

Условие SQL, сгенерированное из этого:

(([Extent1].[Email] = @p__linq__0) OR (([Extent1].[Email] IS NULL) AND (@p__linq__0 IS NULL)))

(([Extent1].[Email] IS NULL) AND (@p__linq__0 IS NULL))

не нужно быть там, насколько я вижу.

Есть ли способ заставить LINQ опустить его?

1 Ответ

0 голосов
/ 21 мая 2018

Они там, если email равно нулю.

Вы можете предотвратить это, установив UseDatabaseNullSemantics в true

Получает или задает значение, указывающее, отображается ли нулевая семантика базы данных при сравнении двух операндов, обаиз которых потенциально обнуляемы.Значение по умолчанию неверно.Например (операнд1 == операнд2) будет переведен как: (операнд1 = операнд2), если UseDatabaseNullSemantics имеет значение true, соответственно (((операнд1 = операнд2) И (НЕ (операнд1 равен нулю ИЛИ операнд2 равен нулю))) ИЛИ ((операнд1 есть)NULL) И (operand2 IS NULL))), если UseDatabaseNullSemantics имеет значение false.

Существуют различные способы применить это.

Если вы хотите применить это только к одному запросу, выможет сделать что-то вроде этого:

using(TheContext dbContext = new TheContext()) {
    dbContext.Configuration.UseDatabaseNullSemantics = true;

    ...

    if (email != null)
    {
        query = query.Where(r => r.Email == email);
    }
}

Если вы хотите применить это ко всем запросам:

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

Вы также можете изменить свойство на [Required]:

public class Model {
    [Required]
    public string Email { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...