2012-07-21 76 views
3

藉此:空凝聚不是LINQ查詢工作

int? item1 = null; 
int? item2 = null; 

someObjectList.Where(x => x.SomeItem1 == (item1 ?? x.SomeItem1) 
         && x.SomeItem2 == (item2 ?? x.SomeItem2) 
        ); 

哪裏someObjectList是不是空的,SomeItem1SomeItem2是在列表中的所有對象null

它爲什麼沒有返回?

編輯:

我的代碼:

public void GetPlacementsByMaterial(long clientMaterialID) 
{ 
    ClientMaterial clientMaterial = ((ApplicationEntityModel)NavigationItem.ObjectContext).ClientMaterial.FirstOrDefault(x => x.ClientMaterialID == clientMaterialID); 

    var list = GetPlacementList(supplier, mediaSpace); 

    PlacementsList = list.Where(x => x.MediaCategoryFormatID == (clientMaterial.MediaCategoryFormatID ?? x.MediaCategoryFormatID) 
               && x.MediaCategorySizeID == (clientMaterial.MediaCategorySizeID ?? x.MediaCategorySizeID) 
          ); 
} 

所有ID是Nullable<long>

編輯:

SQL事件探查器:

SELECT * 
    FROM [dbo].[CampaignSchedulePlacements] AS [Extent5] 
WHERE ([Extent5].[MediaCategoryFormatID] = [Extent5].[MediaCategoryFormatID]) AND ([Extent5].[MediaCategorySizeID] = [Extent5].[MediaCategorySizeID]) 

注:清理`SQL。

+5

請發表一個完整的例子,重現問題。 – CodesInChaos 2012-07-21 17:21:16

+0

它適合我。 SomeItem1是什麼類型的?它是否有一個重載的'=='運算符? – Ryan 2012-07-21 17:22:01

+0

@CodesInChaos看我的更新。 – Willem 2012-07-21 17:27:32

回答

4

在SQL中,NULL不等於NULL。

你可以將NULL解釋爲:「有價值,但我不知道它是什麼」。所以如果你比較兩個NULL值,你真的問「是第一個未知值等於第二個未知值嗎?」當然,沒有理由認爲它們是,所以SQL會說「不」。

我假設這是造成你的問題。您可以通過查看生成的實際SQL來驗證。如果它使用SQL =運算符,這確實是問題。您可以通過在數據庫工具(如SQL Management Studio中運行SQL)中運行SQL來驗證該情況。

UPDATE:

條件

([Extent5].[MediaCategoryFormatID] = [Extent5].[MediaCategoryFormatID]) 

確實會返回false時[Extent5] [MediaCategoryFormatID]爲NULL。

這回答了「爲什麼它什麼都沒有返回?」這個問題。

但是,想到另一個問題:爲什麼實體框架會從這個linq查詢中生成SQL?

恐怕linq實體並不完全知道它的SQL代的質量,而這種情況似乎證實了這一點。你可能會考慮Linq到SQL。即使從長遠來看,這似乎是一條死路,目前的實施如果比實體更好的話。

在這兩種情況下,你有沒有嘗試過類似

someObjectList.Where(x => 
    !item1.hasValue || 
    x.SomeItem1.HasValue && x.SomeItem1.Value == item1.Value) 

確保驗證探查下,以及雖然,LINQ到實體可能搞砸了。

+0

請看我的更新。我在'SQL Profiler'上運行它。任何其他想法? – Willem 2012-07-21 18:25:34

+0

謝謝克里斯。排序。它在'=='的兩側都是NULL。 – Willem 2012-07-21 18:42:23

+3

@Willem and Kris:行爲實際上是LINQ to Entities中的一箇舊bug:http://stackoverflow.com/questions/682429/how-can-i-query-for-null-values-in-entity-framework' null == null'在.NET中是'true',因此它不能在SQL中被直接轉換爲'NULL = NULL',而不是'true'。它已針對.NET 4.5進行了修復,因此您不需要上述解決方法以及.NET 4.5中鏈接問題的答案。 – Slauma 2012-07-21 18:54:05