如何在實體框架中查詢空值?

.net ado.net entity-framework

我想執行這樣的查詢

   var result = from entry in table
                     where entry.something == null
                     select entry;

並獲得一個IS NULL生成。

編輯:在前兩個答案後,我覺得有必要澄清我正在使用實體框架而不是Linq to SQL。 object.Equals()方法似乎不適用於EF。

編輯2:上述查詢按預期工作。它正確生成IS NULL 。然而,我的生產代碼是

value = null;
var result = from entry in table
                         where entry.something == value
                         select entry;

並且生成的SQL是something = @p; @p = NULL 。似乎EF正確地轉換了常量表達式,但是如果涉及變量,它就像正常比較一樣處理它。實際上是有道理的。我會結束這個問題

一般承認的答案

Linq-to-SQL的解決方法:

var result = from entry in table
             where entry.something.Equals(value)
             select entry;

Linq-to-Entities的解決方法(哎喲!):

var result = from entry in table
             where (value == null ? entry.something == null : entry.something == value)
             select entry;

這是一個令人討厭的蟲子,幾次咬我。 如果此錯誤也影響了您,請訪問UserVoice上錯誤報告,並讓Microsoft知道此錯誤也會影響您。


編輯: 此錯誤正在EF 4.5中修復 !感謝大家提出這個錯誤!

為了向後兼容,它將選擇加入 - 您需要手動啟用設置以使entry == value起作用。還沒有關於這個設置是什麼的消息。敬請關注!


編輯2:根據EF團隊的這篇文章這個問題已經在EF6中得到修復!哇噢!

我們更改了EF6的默認行為以補償三值邏輯。

這意味著依賴於舊行為的現有代碼null != null ,但僅在與變量進行比較時)將需要更改為不依賴於該行為,或將UseCSharpNullComparisonBehavior設置為false以使用舊的損壞行為。


熱門答案

從Entity Framework 5.0開始,您可以使用以下代碼來解決您的問題:

public abstract class YourContext : DbContext
{
  public YourContext()
  {
    (this as IObjectContextAdapter).ObjectContext.ContextOptions.UseCSharpNullComparisonBehavior = true;
  }
}

這應該可以解決您的問題,因為實體Framerwork將使用'C#like'null比較。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因