2011-06-09 29 views
2

爲什麼這兩種方法的工作方式不同:爲什麼空,參考空不一樣的東西

public List<Foo> GetFoos() 
    { 
     int? parentId = null; 
     var l = _dataContext.Foos.Where(x => x.ParentElementId == parentId).ToList(); 
     return l; 
    } 

    public List<Foo> GetFoos() 
    { 
     var l = _dataContext.Foos.Where(x => x.ParentElementId == null).ToList(); 
     return l; 
    } 

第一個沒有返回值。其次返回預期的結果。數據來自EF。 ParentElementId可以爲空。

+0

這已經被問過這樣過去一個月內,我不記得決議是什麼?確切的問題是什麼,但確實存在。 – 2011-06-09 19:48:25

+1

@pst知道,幫助很多...它真的是一種解脫... – Agzam 2011-06-09 19:49:31

+1

例如這裏:http://stackoverflow.com/questions/3205238/entity-framework-problem-with-querying-nullable-column – 2011-06-09 20:27:25

回答

4

那是因爲你不能在SQL比較空,它具有特殊的IS NULL操作員檢查空值。

第一個查詢將被翻譯成一個比較,其中參數爲空:

WHERE ParentElementId = @param 

這是不行的,因爲比較兩個空值不會產生如此。

第二個查詢將被翻譯成空檢查,因爲空值是一個常數:

WHERE ParentElementId IS NULL 

這工作,因爲EF沒有上當把它翻譯成對比。

+0

幹得好!再一次,您向我展示了有時需要查看sql profiler窗口的重要性。謝謝! – Agzam 2011-06-09 20:19:07

+0

有沒有一個首選的工作 - 關於然後獲得'空'關閉Nullable null? – 2011-06-09 21:27:58

0

船長顯然:因爲parentId不是null,可能。

編輯的迴應:第一個不是可編譯的。類型不能被傳入null。

回答另一個編輯:由於EF查詢轉換可空類型不正確可能

+0

在這兩種情況下它們都是空的。區別在於第一種類型是==(int?)null(來自'parentId',其中'int?parentId = null'),第二種類型是'==(object)null' 。然而,這會貫穿所有的魔法 - 檢查表達式樹 - 並導致行爲不同。 – 2011-06-09 19:49:36

+0

> EF查詢不正確地轉換可空類型。 你是什麼意思? – Agzam 2011-06-09 20:01:04

+0

@Agzam,EF將您的代碼轉換爲SQL,您可以跟蹤EF執行的查詢並找出差異。可能* Guffa *是正確的,並且EF將第一個轉換爲與null相比較(不起作用),第二個轉換爲null。檢查EF生成的實際SQL查詢。 – Snowbear 2011-06-09 20:16:22

2

我知道,你有你的答案,但這裏是一些額外的觀點:

  • 這個問題已經在MSDN forums討論。有人認爲這是一個bug,有人說這是由於性能原因而產生的故意行爲
  • 它總是有助於運行EFProf或Sql Server Profiler(例如,你使用SQL Server時,例如你的兩個例子翻譯成以下兩個語句分別爲:。

    SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[ParentElementId] AS [ParentElementId] 
    FROM [dbo].[Foo] AS [Extent1] 
    WHERE [Extent1].[ParentElementId] = NULL 
    
    SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[ParentElementId] AS [ParentElementId] 
    FROM [dbo].[Foo] AS [Extent1] 
    WHERE [Extent1].[ParentElementId] IS NULL 
    

這種技術(在生成的SQL看)與EF問題時往往是非常有用的

+0

謝謝......我從來沒有聽說過EFProf。得試試...再次感謝 – Agzam 2011-06-09 20:32:57