【问题标题】:LINQ is Generating Extra IS NULL Condition in SQL StatementLINQ 在 SQL 语句中生成额外的 IS NULL 条件
【发布时间】:2018-05-21 08:31:29
【问题描述】:

我正在编写一些 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 忽略它?

【问题讨论】:

    标签: c# .net entity-framework linq linq-to-entities


    【解决方案1】:

    如果email 为空,它们就会出现。

    您可以通过将UseDatabaseNullSemantics 设置为true 来防止这种情况

    获取或设置一个值,该值指示数据库空语义是否为 比较两个操作数时显示,这两个操作数都可能 可以为空。默认值为假。例如(操作数 1 == 操作数 2) 将被翻译为: (操作数 1 = 操作数 2) 如果 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; }
    }
    

    【讨论】:

    • 谢谢 Nicholas - 是否可以在每个查询的基础上禁用此功能?
    • "如果您只想将此应用于此查询:" -- 这会修改 context 的配置,因此显然适用于在该上下文上运行的所有查询。
    • @hvd 如果您只是在此查询之前设置它,同时将 new Context() 包装在 using 语句中,会出现这种情况吗?
    • @Nicholas 是的,如果您仅在该上下文上运行单个查询,则该上下文的配置仅适用于该单个查询。但是,问题中没有迹象表明已经或可以为此查询创建新的上下文。
    • 在代码优先中,将 [Required] 属性添加到属性会将字段设置为不可为空,这也会删除此条件。我有几个字段应该以这种方式显式设置为不可为空。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多