Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,14 @@ protected override Expression VisitConditional(ConditionalExpression conditional

if (test is BinaryExpression { NodeType: ExpressionType.Equal or ExpressionType.NotEqual } binaryTest)
{
var isLeftNullConstant = IsNullConstant(binaryTest.Left);
var isRightNullConstant = IsNullConstant(binaryTest.Right);
var isLeftNullConstant = binaryTest.Left is ConstantExpression { Value: null };
var isRightNullConstant = binaryTest.Right is ConstantExpression { Value: null };

if ((isLeftNullConstant == isRightNullConstant)
|| (binaryTest.NodeType == ExpressionType.Equal
&& !IsNullConstant(conditionalExpression.IfTrue))
&& conditionalExpression.IfTrue is not ConstantExpression { Value: null })
|| (binaryTest.NodeType == ExpressionType.NotEqual
&& !IsNullConstant(conditionalExpression.IfFalse)))
&& conditionalExpression.IfFalse is not ConstantExpression { Value: null }))
{
return conditionalExpression;
}
Expand Down Expand Up @@ -158,7 +158,4 @@ protected override Expression VisitUnary(UnaryExpression unaryExpression)
return unaryExpression;
}
}

private static bool IsNullConstant(Expression expression)
=> expression is ConstantExpression { Value: null };
}
11 changes: 4 additions & 7 deletions src/EFCore/Query/Internal/QueryOptimizingExpressionVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -375,14 +375,14 @@ when unaryExpression.IsLogicalNot():
&& !(conditionalExpression.Type.IsNullableValueType()
&& visitedMemberExpression.Member.Name is nameof(Nullable<>.HasValue) or nameof(Nullable<>.Value)))
{
var isLeftNullConstant = IsNullConstant(binaryTest.Left);
var isRightNullConstant = IsNullConstant(binaryTest.Right);
var isLeftNullConstant = binaryTest.Left is ConstantExpression { Value: null };
var isRightNullConstant = binaryTest.Right is ConstantExpression { Value: null };

if (isLeftNullConstant != isRightNullConstant
&& ((binaryTest.NodeType == ExpressionType.Equal
&& IsNullConstant(conditionalExpression.IfTrue))
&& conditionalExpression.IfTrue is ConstantExpression { Value: null })
|| (binaryTest.NodeType == ExpressionType.NotEqual
&& IsNullConstant(conditionalExpression.IfFalse))))
&& conditionalExpression.IfFalse is ConstantExpression { Value: null })))
{
var nonNullExpression = binaryTest.NodeType == ExpressionType.Equal
? conditionalExpression.IfFalse
Expand Down Expand Up @@ -418,7 +418,4 @@ when unaryExpression.IsLogicalNot():

return null;
}

private static bool IsNullConstant(Expression expression)
=> expression is ConstantExpression { Value: null };
}