c# - Null 合并在 LINQ 查询中不起作用

标签 c# .net linq linq-to-entities entity-framework-4.3

拿这个:

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

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

在哪里someObjectList不为空且 SomeItem1SomeItem2null在列表中的所有对象中。

为什么它什么也没返回?

编辑:

我的代码:

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。

最佳答案

在 SQL 中,NULL 不等于 NULL。

您可以将 NULL 解释为:“有值,但我不知道它是什么”。因此,如果您比较两个 NULL 值,您实际上是在问“第一个未知值是否等于第二个未知值?”当然,没有理由假设它们是,所以 SQL 会说“不”。

我假设这是导致您的问题的原因。您可以通过查看实际生成的 SQL 来验证这一点。如果它使用 SQL = 运算符,这确实是问题所在。您可以通过在数据库工具中运行 SQL 来验证这一点,例如 SQL Management Studio,以防您使用的是 SQL Server。

更新:

条件

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

当 [Extent5].[MediaCategoryFormatID] 为 NULL 时确实会返回 false。

这回答了“为什么它什么都不返回?”这个问题

但是,我想到了另一个问题: Entity Framework 为什么要从这个 linq 查询生成那个 SQL?

恐怕 linq to entities 的 SQL 生成质量并不完全为人所知,这个案例似乎证实了这一点。您可能会考虑 Linq to SQL。即使从长远来看这似乎是一条死胡同,但当前的实现比 linq to entities 要好得多。

无论哪种情况,您是否尝试过类似的方法

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

尽管如此,请务必在分析器下验证,实体的 linq 也可能会把它搞砸。

关于c# - Null 合并在 LINQ 查询中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11594275/

相关文章:

c# - 按字符串中的序列提取字符 vb 2010

c# - 如何在 Entity Framework 中获取实体的某些列?

linq - 如何从列表中选择具有与另一个列表中的项目匹配的属性的对象?

c# - 通过扩展方法实现多态性?

c# - ParameterizedThreadStart 问题 : what, 方法是否返回对象?

c# - 如何在自定义声明(来自 Auth0)中反序列化 JSON?

c# - 如何在 .NET 中获取夏令时期间的 UTC 偏移量

c# - WCF 端口不监听

c# - Linq 在 if 语句后选择项目

c# - 如何进行sql查询将数据库字符串分成3个不同的部分并比较它们?