拿这个:
int? item1 = null;
int? item2 = null;
someObjectList.Where(x => x.SomeItem1 == (item1 ?? x.SomeItem1)
&& x.SomeItem2 == (item2 ?? x.SomeItem2)
);
在哪里someObjectList
不为空且 SomeItem1
和 SomeItem2
是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。
最佳答案
在 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/