2017-08-24 105 views
5

我已经确定了一个额外的条件,即在执行下面的表达式:实体框架增加了在where子句

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 IS NOT NULL))

+3

嗯,我已经看到了这个为参数,而不是常量。尝试将'DbContext.Configuration.UseDatabaseNullSemantics'设置为'true'。 –

+0

其实这是一个参数,对不起。我只是在这里放一个数字来简化它 – cnom

+0

参数的数据类型是什么? – DavidG

回答

1

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

获取或设置一个值,它指示是否比较两个操作数,这两者都是可能当数据库null语义展出空。默认值是false。例如,如果UseDatabaseNullSemantics为真(((操作数1 =操作数2)AND(不是(操作数1 IS NULL或操作数2 IS NULL)))OR((操作数1操作数2)将被翻译为(操作数1 =操作数2) NULL)AND(operand2 IS NULL)))如果UseDatabaseNullSemantics为false。

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

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

myDbContext.Configuration.UseDatabaseNullSemantics = true; 
+0

实际上没有这种行为并没有打扰我。据我所知,它甚至不会增加任何额外的处理时间(至少不显着)。你会建议我应该改变它的原因吗?我最初的问题基本上是出于好奇 – cnom

+0

我想这只是一个偏好问题,如果你想依赖数据库的空语义或不。建议坚持默认设置,除非您有充分理由不这样做。 –

+0

你的答案可能被接受,但正如我所指出的,在我的情况下,一个操作数不是“可能为空”,所以它不能解释给定的情况。 – cnom