0

我試圖用EF 4.3.1檢索一組記錄。我需要獲得某些列中具有NULL值的所有記錄。使用「IS NULL」的地方

我檢查了數據庫,很多行在該列中都是空的,列也是空的。 EF正在做一些奇怪的事情。查看分析器,它生成以下SQL:

SELECT 
CAST(NULL AS int) AS [C1] 
FROM (SELECT 1 AS X) AS [SingleRowTable1] 
WHERE 1 = 0 

我的實體列被聲明爲「int?」

我試着用以下conbinations,但我得到了相同的結果:

dbset.Where(e=>e.MyNullableInt == null).ToList(); 
dbset.Where(e=>e.MyNullableInt.Equals(null)).ToList(); 

我可以通過這種奇怪的行爲的唯一辦法就是這一步後,裝載全套,填充一個變量,並做了哪裏,因爲它載入所有數據,所以非常不方便。

任何想法如何實現這一目標?

+0

更新:我發現在Codeplex上關於檢測到問題,影響EF之前的版本中的EF以下門票5 http://entityframework.codeplex.com/workitem/178 他們建議使用比較要解決這個問題,但在我的情況下,我不使用一個變量,我需要實際使用空值過濾。 任何人都知道如何解決這個問題? – Charles 2013-04-29 21:12:36

+0

您確定您已將映射定義爲可爲空嗎?你在實體的字段上有[Required]屬性嗎? – 2013-04-29 22:06:38

+0

是的,實際上這個列是一個外鍵。實體的配置是使用流暢的API進行的。 我已經檢查過,並且數據庫有很多行,在這個列中有空值。 如果從EF獲得整個集合,它將爲那些在該列上沒有值的行以及具有這些行的那些行的ID返回null。當您使用(x => x.id == null)條件時會發生此問題。 現在遷移到EF的最新版本並不是一種選擇,因爲它會要求我在整個應用程序中進行多次測試。 – Charles 2013-05-01 15:24:19

回答

1

試試這可能這可以幫助ü...

dbset.Where(e=> (e.MyNullableInt ?? -1) == -1).ToList(); 
+0

它部分工作。 如果您運行dbset.Where(e =>(e.MyNullableInt ?? -1)== -1)...它將不會檢索任何內容。 如果您運行dbset.Where(e =>(e.MyNullableInt ?? -1)!= -1)...它將檢索那些不等於-1的行。 在SQL方面,代碼是這樣的: WHERE(-1 = NullableInt) 和... WHERE(-1 <> NullableInt) 感謝你的幫助。 – Charles 2013-05-07 19:45:47

+0

在SQL術語中它像ISNULL(NullableInt,-1)= -1。我使用它來檢索我的應用程序的數據,它適用於我。 – Nowshath 2013-05-10 04:53:58

+0

也許你正在使用不同版本的EF。在我的API中,生成的SQL非常不同,如下所示:「WHERE(-1 = [Extent1]。[NullableInt])」 – Charles 2013-05-13 14:42:57

0

檢查您的映射,我已經看到這種情況發生時,你的映射在某種程度上使得這一領域的必需。

或在您的數據庫中該字段不可爲空。