【问题标题】:Entity framework adds an extra condition on where clause实体框架在 where 子句上添加了一个额外的条件
【发布时间】:2017-08-24 21:41:13
【问题描述】:

我已经确定在执行以下表达式时:

int aNum = 52;
var myArtifacts = mydbcontext.artifacts.Where(a => a.ParentID == aNum ).ToList();

在mysql上执行的查询是:

SELECT
  `Extent1`.`ID`, 
  `Extent1`.`ParentID`
FROM `artifacts` AS `Extent1`
WHERE ((`Extent1`.`ParentID` = 52) AND (52 IS NOT NULL));

谁能解释一下为什么要添加最后一个额外条件?

AND(52 不为空))

【问题讨论】:

  • 嗯,我已经在参数中看到了这一点,但对于常量却没有。尝试将DbContext.Configuration.UseDatabaseNullSemantics 设置为true
  • 其实是个参数,不好意思。我只是在这里放了一个数字以使其更简单
  • 参数的数据类型是什么?
  • 整数。所以...我现在似乎明白了...检查可空类型?
  • 整数还是可以为空的整数?

标签: c# mysql entity-framework


【解决方案1】:

查看https://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbcontextconfiguration.usedatabasenullsemantics(v=vs.113).aspx

获取或设置一个值,该值指示在比较两个操作数时是否显示数据库空语义,这两个操作数都可能为空。默认值为假。例如 (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 为假。

如果当前行为困扰您,请考虑将UseDatabaseNullSemantics 设置为true

public class MyContext : DbContext
{
    public MyContext()
    {
        this.Configuration.UseDatabaseNullSemantics = true;
    }
}

myDbContext.Configuration.UseDatabaseNullSemantics = true;

【讨论】:

  • 不,实际上这种行为并没有打扰到我。据我所知,它甚至没有增加任何额外的处理时间(至少不显着)。你能提出一个我应该改变它的理由吗?我最初的问题基本上是出于好奇
  • 我想这只是一个偏好问题,如果你想依赖数据库空语义或不。建议坚持默认设置,除非您有充分的理由不这样做。
  • 您的答案可能已被接受,但正如我所指定的,在我的情况下,一个操作数不是“可能为空的”,因此它不能解释给定的情况。
猜你喜欢
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多