【发布时间】:2018-04-11 19:50:17
【问题描述】:
我正在尝试在 linq 中执行多个 where 子句,如下所示:
.Where(x => x.Division == item.Division)
.Where( x => x.ProductID == item.ProductID)
.Where( x => item.supplierNumber == item.supplierNumber)
.Where(x => item.OpcoID == item.OpcoID);
当我吐出 SQL 时,它看起来像这样
WHERE ( ( [extent1].[Division] = @p__linq__0 )
OR ( ( [extent1].[Division] IS NULL )
AND ( @p__linq__0 IS NULL ) ) )
AND ( ( [extent1].[ProductID] = @p__linq__1 )
OR ( ( [extent1].[ProductID] IS NULL )
AND ( @p__linq__1 IS NULL ) ) )
AND ( ( @p__linq__2 = @p__linq__3 )
OR ( ( @p__linq__2 IS NULL )
AND ( @p__linq__3 IS NULL ) ) )
AND ( ( @p__linq__4 = @p__linq__5 )
OR ( ( @p__linq__4 IS NULL )
AND ( @p__linq__5 IS NULL ) ) )
注意
[Extent1].[Division] = @p__linq__0) OR (([Extent1].[Division] IS NULL)
我不希望它包含 或者我只是希望它是
where Division = @p_Linq_0 and [Extent1].[ProductID] = @p_Linq_1
我做错了什么?
【问题讨论】:
-
尝试将所有条件组合到一个 where 子句中,并与 && 运算符链接。第三个和第四个,
item.supplierNumber == item.supplierNumber可能是错误的。 -
尝试将 context.Configuration.UseDatabaseNullSemantics 设置为 true。
-
仅供参考,最后两个子句将始终为
true或抛出NullReferenceException -
您没有做错任何事情,LINQ 生成的表达式可以处理所有可能的情况,并且由于 LINQ / C# 当前默认为任何可能为
null的对象,而null=null在SQL 但在 C# 中是正确的,它必须添加额外的测试来处理这种情况。或许当 C# 具有不可为空性时,他们可以改进 LINQ,使其不再进行测试并让用户感到困惑。 -
正如@RufusL 所说,
item.OpcoID == item.OpcoID也将是微不足道的。
标签: c# linq c#-4.0 entity-framework-6