Я пишу LINQ для извлечения записей на основе электронной почты, однако сгенерированный SQL содержит дополнительное условие IS NULL, которое не должно быть там, потому что я проверяю значение параметра на 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 пропустить его?





Они есть на тот случай, если email равен нулю.
Вы можете предотвратить это, установив для UseDatabaseNullSemantics значение true.
Gets or sets a value indicating whether database null semantics are exhibited when comparing two operands, both of which are potentially nullable. The default value is false. For example (operand1 == operand2) will be translated as: (operand1 = operand2) if UseDatabaseNullSemantics is true, respectively (((operand1 = operand2) AND (NOT (operand1 IS NULL OR operand2 IS NULL))) OR ((operand1 IS NULL) AND (operand2 IS NULL))) if UseDatabaseNullSemantics is 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; }
}
«Если вы хотите применить это только к этому запросу:» - это изменяет конфигурацию контекст, поэтому явно применяется ко всем запросам, выполняемым в этом контексте.
@hvd - это так, если вы просто установите его перед этим запросом, заключив new Context() в оператор using?
@Nicholas Да, если вы запускаете только один запрос в этом контексте, конфигурация этого контекста применяется только к этому единственному запросу. Однако в вопросе нет указаний на то, что для этого запроса создан или может быть создан новый контекст.
В коде сначала добавление атрибута [Required] к свойству устанавливает для поля значение, не допускающее значения NULL, что также удаляет это условие. У меня было несколько полей, которые таким образом должны были быть явно не обнуляемые.
Спасибо, Николас - можно ли отключить это для каждого запроса?