c# - LINQ 在 SQL 语句中生成额外的 IS NULL 条件
问题描述
我正在编写一些 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 忽略它?
解决方案
他们在那里以防万一email
。
您可以通过将UseDatabaseNullSemantics设置为true
获取或设置一个值,该值指示在比较两个操作数时是否显示数据库空语义,这两个操作数都可能为空。默认值为假。例如 (operand1 ==operand2) 将被翻译为: (operand1 =operand2) 如果 UseDatabaseNullSemantics 为真,分别为 (((operand1 =operand2) AND (NOT (operand1 IS NULL OR operand2 IS NULL))) OR ((operand1 IS NULL) AND (operand2 IS NULL))) 如果 UseDatabaseNullSemantics 为假。
有多种方法可以应用它。
如果您只想将其应用于单个查询,您可以执行以下操作:
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; }
}
推荐阅读
- shell - 直接删除文件中以 CR 开头的行
- css - 根据兄弟悬停更改兄弟样式
- c - 即使经过 6 小时的编程,我也看不到程序输出的问题
- mysql - mysql 存储过程 2 IN Param 来自 SELECT
- amazon-web-services - 可以通过 API 网关 GET 但不能 POST 到 Lambda。为什么?
- python - Flaskserver 运行但没有路由?
- c# - 使用 protobuf-net 时如何处理 System.OutOfMemoryException?
- angular - 占位符在升级到角材料 6.4.7 后透明
- javascript - 循环中的执行顺序
- specflow - 通过 SpecFlow 在测试执行期间截取屏幕截图并终止应用程序以防冻结