首页 > 解决方案 > 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 忽略它?

标签: c#.netentity-frameworklinqlinq-to-entities

解决方案


他们在那里以防万一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; }
}

推荐阅读