代码之家  ›  专栏  ›  技术社区  ›  DavidWainwright

LINQ正在SQL语句中生成额外的IS NULL条件

  •  14
  • DavidWainwright  · 技术社区  · 7 年前

    我正在写一些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 回复  |  直到 7 年前
        1
  •  23
  •   Nic    7 年前

    他们在那里以防万一 email 为空。

    您可以通过设置 UseDatabaseNullSemantics true

    获取或设置一个值,该值指示数据库空语义是否为 在比较两个操作数时显示,这两个操作数都可能是 可以为空。默认值为假。例如(operand1== operand2)将转换为:(operand1=operand2)如果 useDatabaseNullSemantics分别为true((operand1=operand2) 和(not(operand1为空或operand2为空))或((operand1为空) 如果usedatabaseNullSemantics为false,则返回null)和(operand2为null))。

    有多种方法可以应用它。

    如果只想将此应用于单个查询,可以执行以下操作:

    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; }
    }