2017-08-24 106 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