2012-07-21 88 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