diff --git a/src/EFCore.Relational/Query/ISqlExpressionFactory.cs b/src/EFCore.Relational/Query/ISqlExpressionFactory.cs
index 0bc538aaa1d..5cf4f57d573 100644
--- a/src/EFCore.Relational/Query/ISqlExpressionFactory.cs
+++ b/src/EFCore.Relational/Query/ISqlExpressionFactory.cs
@@ -252,8 +252,13 @@ public interface ISqlExpressionFactory
/// An expression to compare with in .
/// A list of to compare or evaluate and get result from.
/// A value to return if no matches, if any.
+ /// An optional expression that can be re-used if it matches the new expression.
/// An expression representing a CASE statement in a SQL tree.
- SqlExpression Case(SqlExpression? operand, IReadOnlyList whenClauses, SqlExpression? elseResult);
+ SqlExpression Case(
+ SqlExpression? operand,
+ IReadOnlyList whenClauses,
+ SqlExpression? elseResult,
+ SqlExpression? existingExpr = null);
///
/// Creates a new which represent a CASE statement in a SQL tree.
diff --git a/src/EFCore.Relational/Query/Internal/RelationalValueConverterCompensatingExpressionVisitor.cs b/src/EFCore.Relational/Query/Internal/RelationalValueConverterCompensatingExpressionVisitor.cs
index 025f66d438e..4d3277e86ea 100644
--- a/src/EFCore.Relational/Query/Internal/RelationalValueConverterCompensatingExpressionVisitor.cs
+++ b/src/EFCore.Relational/Query/Internal/RelationalValueConverterCompensatingExpressionVisitor.cs
@@ -72,7 +72,7 @@ private Expression VisitCase(CaseExpression caseExpression)
var elseResult = (SqlExpression?)Visit(caseExpression.ElseResult);
- return caseExpression.Update(operand, whenClauses, elseResult);
+ return _sqlExpressionFactory.Case(operand, whenClauses, elseResult, caseExpression);
}
private Expression VisitSelect(SelectExpression selectExpression)
diff --git a/src/EFCore.Relational/Query/Internal/SqlExpressionSimplifyingExpressionVisitor.cs b/src/EFCore.Relational/Query/Internal/SqlExpressionSimplifyingExpressionVisitor.cs
index 731aa047a82..8b7cef3ab73 100644
--- a/src/EFCore.Relational/Query/Internal/SqlExpressionSimplifyingExpressionVisitor.cs
+++ b/src/EFCore.Relational/Query/Internal/SqlExpressionSimplifyingExpressionVisitor.cs
@@ -45,18 +45,6 @@ protected override Expression VisitExtension(Expression extensionExpression)
return shapedQueryExpression.Update(newQueryExpression, newShaperExpression);
}
- // Only applies to 'CASE WHEN condition...' not 'CASE operand WHEN...'
- if (extensionExpression is CaseExpression
- {
- Operand: null, ElseResult: CaseExpression { Operand: null } nestedCaseExpression
- } caseExpression)
- {
- return VisitExtension(
- _sqlExpressionFactory.Case(
- caseExpression.WhenClauses.Union(nestedCaseExpression.WhenClauses).ToList(),
- nestedCaseExpression.ElseResult));
- }
-
if (extensionExpression is SqlBinaryExpression sqlBinaryExpression)
{
return SimplifySqlBinary(sqlBinaryExpression);
diff --git a/src/EFCore.Relational/Query/SqlExpressionFactory.cs b/src/EFCore.Relational/Query/SqlExpressionFactory.cs
index 993803f8c54..2630ef75bfd 100644
--- a/src/EFCore.Relational/Query/SqlExpressionFactory.cs
+++ b/src/EFCore.Relational/Query/SqlExpressionFactory.cs
@@ -686,7 +686,11 @@ public virtual SqlExpression Negate(SqlExpression operand)
=> MakeUnary(ExpressionType.Negate, operand, operand.Type, operand.TypeMapping)!;
///
- public virtual SqlExpression Case(SqlExpression? operand, IReadOnlyList whenClauses, SqlExpression? elseResult)
+ public virtual SqlExpression Case(
+ SqlExpression? operand,
+ IReadOnlyList whenClauses,
+ SqlExpression? elseResult,
+ SqlExpression? existingExpr = null)
{
RelationalTypeMapping? testTypeMapping;
if (operand == null)
@@ -714,13 +718,113 @@ public virtual SqlExpression Case(SqlExpression? operand, IReadOnlyList();
foreach (var caseWhenClause in whenClauses)
{
+ var test = caseWhenClause.Test;
+
+ if (operand == null && test is CaseExpression { Operand: null, WhenClauses: [var nestedSingleClause] } testExpr)
+ {
+ if (nestedSingleClause.Result is SqlConstantExpression { Value: true }
+ && testExpr.ElseResult is null or SqlConstantExpression { Value: false or null })
+ {
+ // WHEN CASE
+ // WHEN x THEN TRUE
+ // ELSE FALSE/NULL
+ // END THEN y
+ // simplifies to
+ // WHEN x THEN y
+ test = nestedSingleClause.Test;
+ }
+ else if (nestedSingleClause.Result is SqlConstantExpression { Value: false or null }
+ && testExpr.ElseResult is SqlConstantExpression { Value: true })
+ {
+ // same for the negated results
+ test = Not(nestedSingleClause.Test);
+ }
+ }
+
typeMappedWhenClauses.Add(
new CaseWhenClause(
- ApplyTypeMapping(caseWhenClause.Test, testTypeMapping),
+ ApplyTypeMapping(test, testTypeMapping),
ApplyTypeMapping(caseWhenClause.Result, resultTypeMapping)));
}
- return new CaseExpression(operand, typeMappedWhenClauses, elseResult);
+ if (operand is null && elseResult is CaseExpression { Operand: null } nestedCaseExpression)
+ {
+ typeMappedWhenClauses.AddRange(nestedCaseExpression.WhenClauses);
+ elseResult = nestedCaseExpression.ElseResult;
+ }
+
+ typeMappedWhenClauses = typeMappedWhenClauses
+ .Where(c => !IsSkipped(c))
+ .TakeUpTo(IsMatched)
+ .DistinctBy(c => c.Test)
+ .ToList();
+
+ // CASE
+ // ...
+ // WHEN TRUE THEN a
+ // ELSE b
+ // END
+ // simplifies to
+ // CASE
+ // ...
+ // ELSE a
+ // END
+ if (typeMappedWhenClauses.Count > 0 && IsMatched(typeMappedWhenClauses[^1]))
+ {
+ elseResult = typeMappedWhenClauses[^1].Result;
+ typeMappedWhenClauses.RemoveAt(typeMappedWhenClauses.Count - 1);
+ }
+
+ var nullResult = Constant(null, elseResult?.Type ?? whenClauses[0].Result.Type, resultTypeMapping);
+
+ // if there are no whenClauses left (e.g. their tests evaluated to false):
+ // - if there is Else block, return it
+ // - if there is no Else block, return null
+ if (typeMappedWhenClauses.Count == 0)
+ {
+ return elseResult ?? nullResult;
+ }
+
+ // omit `ELSE NULL` (this makes it easier to compare/reuse expressions)
+ if (elseResult is SqlConstantExpression { Value: null })
+ {
+ elseResult = null;
+ }
+
+ // CASE
+ // ...
+ // WHEN x THEN CASE
+ // WHEN y THEN a
+ // ELSE b
+ // END
+ // ELSE b
+ // END
+ // simplifies to
+ // CASE
+ // ...
+ // WHEN x AND y THEN a
+ // ELSE b
+ // END
+ if (operand == null
+ && typeMappedWhenClauses[^1].Result is CaseExpression { Operand: null, WhenClauses: [var lastClause] } lastCase
+ && Equals(elseResult, lastCase.ElseResult))
+ {
+ typeMappedWhenClauses[^1] = new(AndAlso(typeMappedWhenClauses[^1].Test, lastClause.Test), lastClause.Result);
+ elseResult = lastCase.ElseResult;
+ }
+
+ return existingExpr is CaseExpression expr
+ && operand == expr.Operand
+ && typeMappedWhenClauses.SequenceEqual(expr.WhenClauses)
+ && elseResult == expr.ElseResult
+ ? expr
+ : new CaseExpression(operand, typeMappedWhenClauses, elseResult);
+
+ bool IsSkipped(CaseWhenClause clause)
+ => operand is null && clause.Test is SqlConstantExpression { Value: false or null };
+
+ bool IsMatched(CaseWhenClause clause)
+ => operand is null && clause.Test is SqlConstantExpression { Value: true };
}
///
diff --git a/src/EFCore.Relational/Query/SqlNullabilityProcessor.cs b/src/EFCore.Relational/Query/SqlNullabilityProcessor.cs
index 20f898cb8ab..27927ad1ae7 100644
--- a/src/EFCore.Relational/Query/SqlNullabilityProcessor.cs
+++ b/src/EFCore.Relational/Query/SqlNullabilityProcessor.cs
@@ -573,7 +573,7 @@ protected virtual SqlExpression VisitCase(CaseExpression caseExpression, bool al
return elseResult ?? _sqlExpressionFactory.Constant(null, caseExpression.Type, caseExpression.TypeMapping);
}
- return caseExpression.Update(operand, whenClauses, elseResult);
+ return _sqlExpressionFactory.Case(operand, whenClauses, elseResult, caseExpression);
}
///
diff --git a/src/EFCore.SqlServer/Query/Internal/SearchConditionConvertingExpressionVisitor.cs b/src/EFCore.SqlServer/Query/Internal/SearchConditionConvertingExpressionVisitor.cs
index f60f8e35d77..061c79d5822 100644
--- a/src/EFCore.SqlServer/Query/Internal/SearchConditionConvertingExpressionVisitor.cs
+++ b/src/EFCore.SqlServer/Query/Internal/SearchConditionConvertingExpressionVisitor.cs
@@ -132,7 +132,7 @@ protected override Expression VisitCase(CaseExpression caseExpression)
_isSearchCondition = parentSearchCondition;
- return ApplyConversion(caseExpression.Update(operand, whenClauses, elseResult), condition: false);
+ return ApplyConversion(_sqlExpressionFactory.Case(operand, whenClauses, elseResult, caseExpression), condition: false);
}
///
diff --git a/src/Shared/EnumerableExtensions.cs b/src/Shared/EnumerableExtensions.cs
index 7e7829c4dcb..ff5a9f33860 100644
--- a/src/Shared/EnumerableExtensions.cs
+++ b/src/Shared/EnumerableExtensions.cs
@@ -22,6 +22,18 @@ public static IEnumerable Distinct(
where T : class
=> source.Distinct(new DynamicEqualityComparer(comparer));
+ public static IEnumerable TakeUpTo(this IEnumerable source, Func predicate)
+ {
+ foreach (var item in source)
+ {
+ yield return item;
+ if (predicate(item))
+ {
+ yield break;
+ }
+ }
+ }
+
private sealed class DynamicEqualityComparer : IEqualityComparer
where T : class
{
diff --git a/test/EFCore.Cosmos.FunctionalTests/Query/NorthwindSelectQueryCosmosTest.cs b/test/EFCore.Cosmos.FunctionalTests/Query/NorthwindSelectQueryCosmosTest.cs
index e1a28039882..dff9c2e0838 100644
--- a/test/EFCore.Cosmos.FunctionalTests/Query/NorthwindSelectQueryCosmosTest.cs
+++ b/test/EFCore.Cosmos.FunctionalTests/Query/NorthwindSelectQueryCosmosTest.cs
@@ -2012,6 +2012,62 @@ public override Task Select_over_10_nested_ternary_condition(bool async)
SELECT ((c["CustomerID"] = "1") ? "01" : ((c["CustomerID"] = "2") ? "02" : ((c["CustomerID"] = "3") ? "03" : ((c["CustomerID"] = "4") ? "04" : ((c["CustomerID"] = "5") ? "05" : ((c["CustomerID"] = "6") ? "06" : ((c["CustomerID"] = "7") ? "07" : ((c["CustomerID"] = "8") ? "08" : ((c["CustomerID"] = "9") ? "09" : ((c["CustomerID"] = "10") ? "10" : ((c["CustomerID"] = "11") ? "11" : null))))))))))) AS c
FROM root c
WHERE (c["Discriminator"] = "Customer")
+""");
+ });
+
+ public override Task Select_conditional_drops_false(bool async)
+ => Fixture.NoSyncTest(
+ async, async a =>
+ {
+ await base.Select_conditional_drops_false(a);
+
+ AssertSql(
+ """
+SELECT (((c["OrderID"] % 2) = 0) ? c["OrderID"] : -(c["OrderID"])) AS c
+FROM root c
+WHERE (c["Discriminator"] = "Order")
+""");
+ });
+
+ public override Task Select_conditional_terminates_at_true(bool async)
+ => Fixture.NoSyncTest(
+ async, async a =>
+ {
+ await base.Select_conditional_terminates_at_true(a);
+
+ AssertSql(
+ """
+SELECT (((c["OrderID"] % 2) = 0) ? c["OrderID"] : 0) AS c
+FROM root c
+WHERE (c["Discriminator"] = "Order")
+""");
+ });
+
+ public override Task Select_conditional_flatten_nested_results(bool async)
+ => Fixture.NoSyncTest(
+ async, async a =>
+ {
+ await base.Select_conditional_flatten_nested_results(a);
+
+ AssertSql(
+ """
+SELECT (((c["OrderID"] % 2) = 0) ? (((c["OrderID"] % 5) = 0) ? -(c["OrderID"]) : c["OrderID"]) : c["OrderID"]) AS c
+FROM root c
+WHERE (c["Discriminator"] = "Order")
+""");
+ });
+
+ public override Task Select_conditional_flatten_nested_tests(bool async)
+ => Fixture.NoSyncTest(
+ async, async a =>
+ {
+ await base.Select_conditional_flatten_nested_tests(a);
+
+ AssertSql(
+ """
+SELECT ((((c["OrderID"] % 2) = 0) ? false : true) ? c["OrderID"] : -(c["OrderID"])) AS c
+FROM root c
+WHERE (c["Discriminator"] = "Order")
""");
});
diff --git a/test/EFCore.Specification.Tests/Query/NorthwindSelectQueryTestBase.cs b/test/EFCore.Specification.Tests/Query/NorthwindSelectQueryTestBase.cs
index ce0c021e3ca..9e60a45a8f1 100644
--- a/test/EFCore.Specification.Tests/Query/NorthwindSelectQueryTestBase.cs
+++ b/test/EFCore.Specification.Tests/Query/NorthwindSelectQueryTestBase.cs
@@ -766,6 +766,52 @@ public virtual Task Select_over_10_nested_ternary_condition(bool isAsync)
? "11"
: null);
+ [ConditionalTheory]
+ [MemberData(nameof(IsAsyncData))]
+ public virtual Task Select_conditional_drops_false(bool async)
+ => AssertQueryScalar(
+ async,
+ ss => from o in ss.Set()
+ select o.OrderID % 2 == 0
+ ? o.OrderID
+ : false
+ ? 0
+ : -o.OrderID );
+
+ [ConditionalTheory]
+ [MemberData(nameof(IsAsyncData))]
+ public virtual Task Select_conditional_terminates_at_true(bool async)
+ => AssertQueryScalar(
+ async,
+ ss => from o in ss.Set()
+ select o.OrderID % 2 == 0
+ ? o.OrderID
+ : true
+ ? 0
+ : -o.OrderID );
+
+ [ConditionalTheory]
+ [MemberData(nameof(IsAsyncData))]
+ public virtual Task Select_conditional_flatten_nested_results(bool async)
+ => AssertQueryScalar(
+ async,
+ ss => from o in ss.Set()
+ select o.OrderID % 2 == 0
+ ? o.OrderID % 5 == 0
+ ? -o.OrderID
+ : o.OrderID
+ : o.OrderID);
+
+ [ConditionalTheory]
+ [MemberData(nameof(IsAsyncData))]
+ public virtual Task Select_conditional_flatten_nested_tests(bool async)
+ => AssertQueryScalar(
+ async,
+ ss => from o in ss.Set()
+ select (o.OrderID % 2 == 0 ? false : true)
+ ? o.OrderID
+ : -o.OrderID);
+
[ConditionalTheory]
[MemberData(nameof(IsAsyncData))]
public virtual Task Projection_in_a_subquery_should_be_liftable(bool async)
diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/AdHocMiscellaneousQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/AdHocMiscellaneousQuerySqlServerTest.cs
index de969e5374e..16b371a33e7 100644
--- a/test/EFCore.SqlServer.FunctionalTests/Query/AdHocMiscellaneousQuerySqlServerTest.cs
+++ b/test/EFCore.SqlServer.FunctionalTests/Query/AdHocMiscellaneousQuerySqlServerTest.cs
@@ -1677,7 +1677,6 @@ public override async Task Conditional_expression_with_conditions_does_not_colla
"""
SELECT CASE
WHEN [c0].[Id] IS NOT NULL THEN [c0].[Processed] ^ CAST(1 AS bit)
- ELSE NULL
END AS [Processing]
FROM [Carts] AS [c]
LEFT JOIN [Configuration] AS [c0] ON [c].[ConfigurationId] = [c0].[Id]
@@ -2398,7 +2397,6 @@ FROM [Customers] AS [c]
LEFT JOIN [Countries] AS [c1] ON [c0].[CountryId] = [c1].[Id]
WHERE CASE
WHEN [c0].[Id] IS NOT NULL THEN [c1].[CountryName]
- ELSE NULL
END = N'COUNTRY'
""");
}
diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsQuerySqlServerTest.cs
index fbef3cfbe2e..6ada8222c2e 100644
--- a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsQuerySqlServerTest.cs
+++ b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsQuerySqlServerTest.cs
@@ -2990,7 +2990,6 @@ public override async Task Project_collection_and_nested_conditional(bool async)
WHEN [l].[Id] = 1 THEN N'01'
WHEN [l].[Id] = 2 THEN N'02'
WHEN [l].[Id] = 3 THEN N'03'
- ELSE NULL
END
FROM [LevelOne] AS [l]
LEFT JOIN [LevelTwo] AS [l0] ON [l].[Id] = [l0].[OneToMany_Optional_Inverse2Id]
@@ -2998,7 +2997,6 @@ WHERE CASE
WHEN [l].[Id] = 1 THEN N'01'
WHEN [l].[Id] = 2 THEN N'02'
WHEN [l].[Id] = 3 THEN N'03'
- ELSE NULL
END = N'02'
ORDER BY [l].[Id], [l0].[Id]
""");
diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsSharedTypeQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsSharedTypeQuerySqlServerTest.cs
index b757fd90033..8e6aa9a6b77 100644
--- a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsSharedTypeQuerySqlServerTest.cs
+++ b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsSharedTypeQuerySqlServerTest.cs
@@ -3878,7 +3878,6 @@ public override async Task Project_collection_and_nested_conditional(bool async)
WHEN [l].[Id] = 1 THEN N'01'
WHEN [l].[Id] = 2 THEN N'02'
WHEN [l].[Id] = 3 THEN N'03'
- ELSE NULL
END
FROM [Level1] AS [l]
LEFT JOIN (
@@ -3892,7 +3891,6 @@ WHERE CASE
WHEN [l].[Id] = 1 THEN N'01'
WHEN [l].[Id] = 2 THEN N'02'
WHEN [l].[Id] = 3 THEN N'03'
- ELSE NULL
END = N'02'
ORDER BY [l].[Id], [l1].[c]
""");
diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsSplitQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsSplitQuerySqlServerTest.cs
index 922133491db..fac384c0bcd 100644
--- a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsSplitQuerySqlServerTest.cs
+++ b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsSplitQuerySqlServerTest.cs
@@ -4425,14 +4425,12 @@ public override async Task Project_collection_and_nested_conditional(bool async)
WHEN [l].[Id] = 1 THEN N'01'
WHEN [l].[Id] = 2 THEN N'02'
WHEN [l].[Id] = 3 THEN N'03'
- ELSE NULL
END
FROM [LevelOne] AS [l]
WHERE CASE
WHEN [l].[Id] = 1 THEN N'01'
WHEN [l].[Id] = 2 THEN N'02'
WHEN [l].[Id] = 3 THEN N'03'
- ELSE NULL
END = N'02'
ORDER BY [l].[Id]
""",
@@ -4445,7 +4443,6 @@ WHERE CASE
WHEN [l].[Id] = 1 THEN N'01'
WHEN [l].[Id] = 2 THEN N'02'
WHEN [l].[Id] = 3 THEN N'03'
- ELSE NULL
END = N'02'
ORDER BY [l].[Id], [l2].[Id]
""");
diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/GearsOfWarQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/GearsOfWarQuerySqlServerTest.cs
index de530e0f151..7ca1b124855 100644
--- a/test/EFCore.SqlServer.FunctionalTests/Query/GearsOfWarQuerySqlServerTest.cs
+++ b/test/EFCore.SqlServer.FunctionalTests/Query/GearsOfWarQuerySqlServerTest.cs
@@ -956,10 +956,8 @@ public override async Task Null_propagation_optimization2(bool async)
FROM [Gears] AS [g]
WHERE CASE
WHEN [g].[LeaderNickname] IS NULL THEN NULL
- ELSE CASE
- WHEN [g].[LeaderNickname] LIKE N'%us' AND [g].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit)
- ELSE CAST(0 AS bit)
- END
+ WHEN [g].[LeaderNickname] LIKE N'%us' AND [g].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit)
+ ELSE CAST(0 AS bit)
END = CAST(1 AS bit)
""");
}
@@ -978,7 +976,6 @@ WHEN [g].[LeaderNickname] IS NOT NULL THEN CASE
WHEN [g].[LeaderNickname] LIKE N'%us' THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
- ELSE NULL
END = CAST(1 AS bit)
""");
}
@@ -1010,7 +1007,6 @@ public override async Task Null_propagation_optimization5(bool async)
FROM [Gears] AS [g]
WHERE CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(LEN([g].[LeaderNickname]) AS int)
- ELSE NULL
END = 5
""");
}
@@ -1026,7 +1022,6 @@ public override async Task Null_propagation_optimization6(bool async)
FROM [Gears] AS [g]
WHERE CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(LEN([g].[LeaderNickname]) AS int)
- ELSE NULL
END = 5
""");
}
@@ -1040,7 +1035,6 @@ public override async Task Select_null_propagation_optimization7(bool async)
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN [g].[LeaderNickname] + [g].[LeaderNickname]
- ELSE NULL
END
FROM [Gears] AS [g]
""");
@@ -1076,7 +1070,6 @@ public override async Task Select_null_propagation_negative1(bool async)
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit)
- ELSE NULL
END
FROM [Gears] AS [g]
""");
@@ -1090,7 +1083,6 @@ public override async Task Select_null_propagation_negative2(bool async)
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN [g0].[LeaderNickname]
- ELSE NULL
END
FROM [Gears] AS [g]
CROSS JOIN [Gears] AS [g0]
@@ -1108,7 +1100,6 @@ WHEN [g0].[Nickname] IS NOT NULL AND [g0].[SquadId] IS NOT NULL THEN CASE
WHEN [g0].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
- ELSE NULL
END AS [Condition]
FROM [Gears] AS [g]
LEFT JOIN [Gears] AS [g0] ON [g].[HasSoulPatch] = CAST(1 AS bit)
@@ -1156,7 +1147,6 @@ public override async Task Select_null_propagation_negative6(bool async)
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(0 AS bit)
- ELSE NULL
END
FROM [Gears] AS [g]
""");
@@ -1170,7 +1160,6 @@ public override async Task Select_null_propagation_negative7(bool async)
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit)
- ELSE NULL
END
FROM [Gears] AS [g]
""");
@@ -1184,7 +1173,6 @@ public override async Task Select_null_propagation_negative8(bool async)
"""
SELECT CASE
WHEN [s].[Id] IS NOT NULL THEN [c].[Name]
- ELSE NULL
END
FROM [Tags] AS [t]
LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
@@ -1201,7 +1189,6 @@ public override async Task Select_null_propagation_negative9(bool async)
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit)
- ELSE NULL
END
FROM [Gears] AS [g]
""");
@@ -1227,7 +1214,6 @@ public override async Task Select_null_propagation_works_for_multiple_navigation
"""
SELECT CASE
WHEN [c].[Name] IS NOT NULL THEN [c].[Name]
- ELSE NULL
END
FROM [Tags] AS [t]
LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
@@ -3642,7 +3628,6 @@ public override async Task Select_null_conditional_with_inheritance(bool async)
"""
SELECT CASE
WHEN [f].[CommanderName] IS NOT NULL THEN [f].[CommanderName]
- ELSE NULL
END
FROM [Factions] AS [f]
""");
@@ -3656,7 +3641,6 @@ public override async Task Select_null_conditional_with_inheritance_negative(boo
"""
SELECT CASE
WHEN [f].[CommanderName] IS NOT NULL THEN [f].[Eradicated]
- ELSE NULL
END
FROM [Factions] AS [f]
""");
@@ -6315,13 +6299,11 @@ public override async Task OrderBy_same_expression_containing_IsNull_correctly_d
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit)
- ELSE NULL
END
FROM [Gears] AS [g]
ORDER BY CASE
WHEN CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit)
- ELSE NULL
END IS NOT NULL THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
@@ -7586,16 +7568,13 @@ public override async Task Join_inner_source_custom_projection_followed_by_filte
"""
SELECT CASE
WHEN [f].[Name] = N'Locust' THEN CAST(1 AS bit)
- ELSE NULL
END AS [IsEradicated], [f].[CommanderName], [f].[Name]
FROM [LocustLeaders] AS [l]
INNER JOIN [Factions] AS [f] ON [l].[Name] = [f].[CommanderName]
WHERE CASE
WHEN [f].[Name] = N'Locust' THEN CAST(1 AS bit)
- ELSE NULL
END = CAST(0 AS bit) OR CASE
WHEN [f].[Name] = N'Locust' THEN CAST(1 AS bit)
- ELSE NULL
END IS NULL
""");
}
@@ -7707,16 +7686,13 @@ public override async Task Conditional_expression_with_test_being_simplified_to_
SELECT [g].[Nickname], [g].[SquadId], [g].[AssignedCityName], [g].[CityOfBirthName], [g].[Discriminator], [g].[FullName], [g].[HasSoulPatch], [g].[LeaderNickname], [g].[LeaderSquadId], [g].[Rank]
FROM [Gears] AS [g]
WHERE CASE
- WHEN [g].[HasSoulPatch] = @__prm_0 THEN CASE
- WHEN (
- SELECT TOP(1) [w].[Name]
- FROM [Weapons] AS [w]
- WHERE [w].[Id] = [g].[SquadId]) = @__prm2_1 AND (
- SELECT TOP(1) [w].[Name]
- FROM [Weapons] AS [w]
- WHERE [w].[Id] = [g].[SquadId]) IS NOT NULL THEN CAST(1 AS bit)
- ELSE CAST(0 AS bit)
- END
+ WHEN [g].[HasSoulPatch] = @__prm_0 AND (
+ SELECT TOP(1) [w].[Name]
+ FROM [Weapons] AS [w]
+ WHERE [w].[Id] = [g].[SquadId]) = @__prm2_1 AND (
+ SELECT TOP(1) [w].[Name]
+ FROM [Weapons] AS [w]
+ WHERE [w].[Id] = [g].[SquadId]) IS NOT NULL THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END = CAST(1 AS bit)
""");
@@ -8654,7 +8630,6 @@ FROM [Tags] AS [t]
LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId]
- ELSE NULL
END = 1
""");
}
@@ -8673,7 +8648,6 @@ FROM [Tags] AS [t]
LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId]
- ELSE NULL
END + 1 = 2
""");
}
@@ -8686,13 +8660,11 @@ public override async Task Projecting_property_converted_to_nullable_with_additi
"""
SELECT [t].[Note], CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId]
- ELSE NULL
END + 1 AS [Value]
FROM [Tags] AS [t]
LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname]
- ELSE NULL
END IS NOT NULL
""");
}
@@ -8706,7 +8678,6 @@ public override async Task Projecting_property_converted_to_nullable_with_condit
SELECT CASE
WHEN [t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL THEN CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId]
- ELSE NULL
END
ELSE -1
END
@@ -8723,7 +8694,6 @@ public override async Task Projecting_property_converted_to_nullable_with_functi
"""
SELECT SUBSTRING(CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname]
- ELSE NULL
END, 0 + 1, 3)
FROM [Tags] AS [t]
LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
@@ -8738,13 +8708,11 @@ public override async Task Projecting_property_converted_to_nullable_with_functi
"""
SELECT [t].[Note], SUBSTRING([t].[Note], 0 + 1, CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId]
- ELSE NULL
END) AS [Function]
FROM [Tags] AS [t]
LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname]
- ELSE NULL
END IS NOT NULL
""");
}
@@ -8757,19 +8725,15 @@ public override async Task Projecting_property_converted_to_nullable_into_elemen
"""
SELECT CASE
WHEN [t].[GearNickName] IS NOT NULL THEN CAST(LEN([g].[Nickname]) AS int)
- ELSE NULL
END, CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId]
- ELSE NULL
END, CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId]
- ELSE NULL
END + 1
FROM [Tags] AS [t]
LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname]
- ELSE NULL
END IS NOT NULL
ORDER BY [t].[Note]
""");
@@ -8783,13 +8747,11 @@ public override async Task Projecting_property_converted_to_nullable_into_member
"""
SELECT CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId]
- ELSE NULL
END AS [Id]
FROM [Tags] AS [t]
LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname]
- ELSE NULL
END IS NOT NULL
ORDER BY [t].[Note]
""");
@@ -8803,19 +8765,15 @@ public override async Task Projecting_property_converted_to_nullable_into_new_ar
"""
SELECT CASE
WHEN [t].[GearNickName] IS NOT NULL THEN CAST(LEN([g].[Nickname]) AS int)
- ELSE NULL
END, CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId]
- ELSE NULL
END, CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId]
- ELSE NULL
END + 1
FROM [Tags] AS [t]
LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname]
- ELSE NULL
END IS NOT NULL
ORDER BY [t].[Note]
""");
@@ -8832,10 +8790,8 @@ FROM [Tags] AS [t]
LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname]
- ELSE NULL
END IS NOT NULL AND CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[HasSoulPatch]
- ELSE NULL
END = CAST(0 AS bit)
ORDER BY [t].[Note]
""");
@@ -8869,11 +8825,9 @@ FROM [Tags] AS [t]
LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname]
- ELSE NULL
END IS NOT NULL
ORDER BY CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId]
- ELSE NULL
END, [t].[Note]
""");
}
diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindMiscellaneousQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindMiscellaneousQuerySqlServerTest.cs
index 047d9c29e53..d88fe6eedeb 100644
--- a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindMiscellaneousQuerySqlServerTest.cs
+++ b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindMiscellaneousQuerySqlServerTest.cs
@@ -1009,16 +1009,24 @@ ELSE CAST(0 AS bit)
}
public override async Task OrderBy_ternary_conditions(bool async)
- => await base.OrderBy_ternary_conditions(async);
+ {
+ await base.OrderBy_ternary_conditions(async);
+
+ AssertSql(
+ """
+SELECT [p].[ProductID], [p].[Discontinued], [p].[ProductName], [p].[SupplierID], [p].[UnitPrice], [p].[UnitsInStock]
+FROM [Products] AS [p]
+ORDER BY CASE
+ WHEN [p].[UnitsInStock] > CAST(10 AS smallint) THEN CASE
+ WHEN [p].[ProductID] > 40 THEN CAST(1 AS bit)
+ ELSE CAST(0 AS bit)
+ END
+ WHEN [p].[ProductID] <= 40 THEN CAST(1 AS bit)
+ ELSE CAST(0 AS bit)
+END, [p].[ProductID]
+""");
+ }
- // issue #18774
- // AssertSql(
- // @"SELECT [p].[ProductID], [p].[Discontinued], [p].[ProductName], [p].[SupplierID], [p].[UnitPrice], [p].[UnitsInStock]
- //FROM [Products] AS [p]
- //ORDER BY CASE
- // WHEN (([p].[UnitsInStock] > CAST(10 AS smallint)) AND ([p].[ProductID] > 40)) OR (([p].[UnitsInStock] <= CAST(10 AS smallint)) AND ([p].[ProductID] <= 40))
- // THEN CAST(1 AS bit) ELSE CAST(0 AS bit)
- //END, [p].[ProductID]");
public override async Task OrderBy_any(bool async)
{
await base.OrderBy_any(async);
@@ -5873,7 +5881,6 @@ FROM [Orders] AS [o]
SELECT TOP(1) [o0].[OrderDate]
FROM [Orders] AS [o0]
WHERE [c].[CustomerID] = [o0].[CustomerID])
- ELSE NULL
END AS [OrderDate]
FROM [Customers] AS [c]
WHERE [c].[CustomerID] LIKE N'F%'
diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindSelectQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindSelectQuerySqlServerTest.cs
index 67f7f8464cd..30732589058 100644
--- a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindSelectQuerySqlServerTest.cs
+++ b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindSelectQuerySqlServerTest.cs
@@ -639,10 +639,8 @@ public override async Task Select_conditional_with_null_comparison_in_test(bool
"""
SELECT CASE
WHEN [o].[CustomerID] IS NULL THEN CAST(1 AS bit)
- ELSE CASE
- WHEN [o].[OrderID] < 100 THEN CAST(1 AS bit)
- ELSE CAST(0 AS bit)
- END
+ WHEN [o].[OrderID] < 100 THEN CAST(1 AS bit)
+ ELSE CAST(0 AS bit)
END
FROM [Orders] AS [o]
WHERE [o].[CustomerID] = N'ALFKI'
@@ -667,12 +665,67 @@ SELECT CASE
WHEN [c].[CustomerID] = N'9' THEN N'09'
WHEN [c].[CustomerID] = N'10' THEN N'10'
WHEN [c].[CustomerID] = N'11' THEN N'11'
- ELSE NULL
END
FROM [Customers] AS [c]
""");
}
+ public override async Task Select_conditional_drops_false(bool isAsync)
+ {
+ await base.Select_conditional_drops_false(isAsync);
+
+ AssertSql(
+ """
+SELECT CASE
+ WHEN [o].[OrderID] % 2 = 0 THEN [o].[OrderID]
+ ELSE -[o].[OrderID]
+END
+FROM [Orders] AS [o]
+""");
+ }
+
+ public override async Task Select_conditional_terminates_at_true(bool isAsync)
+ {
+ await base.Select_conditional_terminates_at_true(isAsync);
+
+ AssertSql(
+ """
+SELECT CASE
+ WHEN [o].[OrderID] % 2 = 0 THEN [o].[OrderID]
+ ELSE 0
+END
+FROM [Orders] AS [o]
+""");
+ }
+
+ public override async Task Select_conditional_flatten_nested_results(bool isAsync)
+ {
+ await base.Select_conditional_flatten_nested_results(isAsync);
+
+ AssertSql(
+ """
+SELECT CASE
+ WHEN [o].[OrderID] % 2 = 0 AND [o].[OrderID] % 5 = 0 THEN -[o].[OrderID]
+ ELSE [o].[OrderID]
+END
+FROM [Orders] AS [o]
+""");
+ }
+
+ public override async Task Select_conditional_flatten_nested_tests(bool isAsync)
+ {
+ await base.Select_conditional_flatten_nested_tests(isAsync);
+
+ AssertSql(
+ """
+SELECT CASE
+ WHEN [o].[OrderID] % 2 <> 0 THEN [o].[OrderID]
+ ELSE -[o].[OrderID]
+END
+FROM [Orders] AS [o]
+""");
+ }
+
public override async Task Projection_in_a_subquery_should_be_liftable(bool async)
{
await base.Projection_in_a_subquery_should_be_liftable(async);
diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NullSemanticsQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NullSemanticsQuerySqlServerTest.cs
index 63b99397333..9b6e3004f16 100644
--- a/test/EFCore.SqlServer.FunctionalTests/Query/NullSemanticsQuerySqlServerTest.cs
+++ b/test/EFCore.SqlServer.FunctionalTests/Query/NullSemanticsQuerySqlServerTest.cs
@@ -2823,10 +2823,8 @@ ELSE CAST(0 AS bit)
END
ELSE [e].[BoolC]
END <> [e].[BoolB] THEN [e].[BoolA]
- ELSE CASE
- WHEN ([e].[NullableBoolB] = [e].[NullableBoolC] AND [e].[NullableBoolB] IS NOT NULL AND [e].[NullableBoolC] IS NOT NULL) OR ([e].[NullableBoolB] IS NULL AND [e].[NullableBoolC] IS NULL) THEN CAST(1 AS bit)
- ELSE CAST(0 AS bit)
- END
+ WHEN ([e].[NullableBoolB] = [e].[NullableBoolC] AND [e].[NullableBoolB] IS NOT NULL AND [e].[NullableBoolC] IS NOT NULL) OR ([e].[NullableBoolB] IS NULL AND [e].[NullableBoolC] IS NULL) THEN CAST(1 AS bit)
+ ELSE CAST(0 AS bit)
END = CAST(1 AS bit)
""",
//
@@ -4327,10 +4325,8 @@ WHEN [e].[NullableStringA] IS NULL THEN CASE
WHEN ([e].[NullableStringA] <> [e].[NullableStringB] OR [e].[NullableStringA] IS NULL OR [e].[NullableStringB] IS NULL) AND ([e].[NullableStringA] IS NOT NULL OR [e].[NullableStringB] IS NOT NULL) THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
- ELSE CASE
- WHEN ([e].[NullableStringA] <> [e].[NullableStringC] OR [e].[NullableStringA] IS NULL OR [e].[NullableStringC] IS NULL) AND ([e].[NullableStringA] IS NOT NULL OR [e].[NullableStringC] IS NOT NULL) THEN CAST(1 AS bit)
- ELSE CAST(0 AS bit)
- END
+ WHEN ([e].[NullableStringA] <> [e].[NullableStringC] OR [e].[NullableStringA] IS NULL OR [e].[NullableStringC] IS NULL) AND ([e].[NullableStringA] IS NOT NULL OR [e].[NullableStringC] IS NOT NULL) THEN CAST(1 AS bit)
+ ELSE CAST(0 AS bit)
END = CAST(1 AS bit)
""");
}
@@ -4349,10 +4345,8 @@ WHEN [e].[NullableStringA] IS NULL OR [e].[NullableStringB] IS NULL THEN CASE
WHEN ([e].[NullableStringA] = [e].[NullableStringB] AND [e].[NullableStringA] IS NOT NULL AND [e].[NullableStringB] IS NOT NULL) OR ([e].[NullableStringA] IS NULL AND [e].[NullableStringB] IS NULL) THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
- ELSE CASE
- WHEN ([e].[NullableStringA] <> [e].[NullableStringB] OR [e].[NullableStringA] IS NULL OR [e].[NullableStringB] IS NULL) AND ([e].[NullableStringA] IS NOT NULL OR [e].[NullableStringB] IS NOT NULL) THEN CAST(1 AS bit)
- ELSE CAST(0 AS bit)
- END
+ WHEN ([e].[NullableStringA] <> [e].[NullableStringB] OR [e].[NullableStringA] IS NULL OR [e].[NullableStringB] IS NULL) AND ([e].[NullableStringA] IS NOT NULL OR [e].[NullableStringB] IS NOT NULL) THEN CAST(1 AS bit)
+ ELSE CAST(0 AS bit)
END = CAST(1 AS bit)
""");
}
@@ -4370,10 +4364,8 @@ WHERE CASE
WHEN ([e].[NullableStringA] = [e].[NullableStringB] AND [e].[NullableStringA] IS NOT NULL AND [e].[NullableStringB] IS NOT NULL) OR ([e].[NullableStringA] IS NULL AND [e].[NullableStringB] IS NULL) THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
- ELSE CASE
- WHEN ([e].[NullableStringA] <> [e].[NullableStringB] OR [e].[NullableStringA] IS NULL OR [e].[NullableStringB] IS NULL) AND ([e].[NullableStringA] IS NOT NULL OR [e].[NullableStringB] IS NOT NULL) THEN CAST(1 AS bit)
- ELSE CAST(0 AS bit)
- END
+ WHEN ([e].[NullableStringA] <> [e].[NullableStringB] OR [e].[NullableStringA] IS NULL OR [e].[NullableStringB] IS NULL) AND ([e].[NullableStringA] IS NOT NULL OR [e].[NullableStringB] IS NOT NULL) THEN CAST(1 AS bit)
+ ELSE CAST(0 AS bit)
END = CAST(1 AS bit)
""");
}
@@ -4392,10 +4384,8 @@ WHEN [e].[NullableBoolB] IS NULL THEN CASE
WHEN [e].[NullableBoolB] <> [e].[NullableBoolA] OR [e].[NullableBoolB] IS NULL THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
- ELSE CASE
- WHEN [e].[NullableBoolA] <> [e].[NullableBoolB] OR [e].[NullableBoolB] IS NULL THEN CAST(1 AS bit)
- ELSE CAST(0 AS bit)
- END
+ WHEN [e].[NullableBoolA] <> [e].[NullableBoolB] OR [e].[NullableBoolB] IS NULL THEN CAST(1 AS bit)
+ ELSE CAST(0 AS bit)
END = CAST(1 AS bit)
""");
}
@@ -4415,10 +4405,8 @@ WHEN [e].[NullableBoolC] IS NULL THEN CASE
WHEN ([e].[NullableBoolA] <> [e].[NullableBoolC] OR [e].[NullableBoolA] IS NULL OR [e].[NullableBoolC] IS NULL) AND ([e].[NullableBoolA] IS NOT NULL OR [e].[NullableBoolC] IS NOT NULL) THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
- ELSE CASE
- WHEN ([e].[NullableBoolC] <> [e].[NullableBoolA] OR [e].[NullableBoolC] IS NULL OR [e].[NullableBoolA] IS NULL) AND ([e].[NullableBoolC] IS NOT NULL OR [e].[NullableBoolA] IS NOT NULL) THEN CAST(1 AS bit)
- ELSE CAST(0 AS bit)
- END
+ WHEN ([e].[NullableBoolC] <> [e].[NullableBoolA] OR [e].[NullableBoolC] IS NULL OR [e].[NullableBoolA] IS NULL) AND ([e].[NullableBoolC] IS NOT NULL OR [e].[NullableBoolA] IS NOT NULL) THEN CAST(1 AS bit)
+ ELSE CAST(0 AS bit)
END = CAST(1 AS bit)
""");
}
diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/TPCGearsOfWarQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/TPCGearsOfWarQuerySqlServerTest.cs
index bfbb9d79f08..fb3d5eb4945 100644
--- a/test/EFCore.SqlServer.FunctionalTests/Query/TPCGearsOfWarQuerySqlServerTest.cs
+++ b/test/EFCore.SqlServer.FunctionalTests/Query/TPCGearsOfWarQuerySqlServerTest.cs
@@ -1336,10 +1336,8 @@ FROM [Officers] AS [o]
) AS [u]
WHERE CASE
WHEN [u].[LeaderNickname] IS NULL THEN NULL
- ELSE CASE
- WHEN [u].[LeaderNickname] LIKE N'%us' AND [u].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit)
- ELSE CAST(0 AS bit)
- END
+ WHEN [u].[LeaderNickname] LIKE N'%us' AND [u].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit)
+ ELSE CAST(0 AS bit)
END = CAST(1 AS bit)
""");
}
@@ -1364,7 +1362,6 @@ WHEN [u].[LeaderNickname] IS NOT NULL THEN CASE
WHEN [u].[LeaderNickname] LIKE N'%us' THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
- ELSE NULL
END = CAST(1 AS bit)
""");
}
@@ -1408,7 +1405,6 @@ FROM [Officers] AS [o]
) AS [u]
WHERE CASE
WHEN [u].[LeaderNickname] IS NOT NULL THEN CAST(LEN([u].[LeaderNickname]) AS int)
- ELSE NULL
END = 5
""");
}
@@ -1430,7 +1426,6 @@ FROM [Officers] AS [o]
) AS [u]
WHERE CASE
WHEN [u].[LeaderNickname] IS NOT NULL THEN CAST(LEN([u].[LeaderNickname]) AS int)
- ELSE NULL
END = 5
""");
}
@@ -1444,7 +1439,6 @@ public override async Task Select_null_propagation_optimization7(bool async)
"""
SELECT CASE
WHEN [u].[LeaderNickname] IS NOT NULL THEN [u].[LeaderNickname] + [u].[LeaderNickname]
- ELSE NULL
END
FROM (
SELECT [g].[LeaderNickname]
@@ -1498,7 +1492,6 @@ public override async Task Select_null_propagation_negative1(bool async)
"""
SELECT CASE
WHEN [u].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([u].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit)
- ELSE NULL
END
FROM (
SELECT [g].[Nickname], [g].[LeaderNickname]
@@ -1518,7 +1511,6 @@ public override async Task Select_null_propagation_negative2(bool async)
"""
SELECT CASE
WHEN [u].[LeaderNickname] IS NOT NULL THEN [u0].[LeaderNickname]
- ELSE NULL
END
FROM (
SELECT [g].[LeaderNickname]
@@ -1548,7 +1540,6 @@ WHEN [u0].[Nickname] IS NOT NULL AND [u0].[SquadId] IS NOT NULL THEN CASE
WHEN [u0].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
- ELSE NULL
END AS [Condition]
FROM (
SELECT [g].[HasSoulPatch]
@@ -1632,7 +1623,6 @@ public override async Task Select_null_propagation_negative6(bool async)
"""
SELECT CASE
WHEN [u].[LeaderNickname] IS NOT NULL THEN CAST(0 AS bit)
- ELSE NULL
END
FROM (
SELECT [g].[LeaderNickname]
@@ -1652,7 +1642,6 @@ public override async Task Select_null_propagation_negative7(bool async)
"""
SELECT CASE
WHEN [u].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit)
- ELSE NULL
END
FROM (
SELECT [g].[LeaderNickname]
@@ -1672,7 +1661,6 @@ public override async Task Select_null_propagation_negative8(bool async)
"""
SELECT CASE
WHEN [s].[Id] IS NOT NULL THEN [c].[Name]
- ELSE NULL
END
FROM [Tags] AS [t]
LEFT JOIN (
@@ -1695,7 +1683,6 @@ public override async Task Select_null_propagation_negative9(bool async)
"""
SELECT CASE
WHEN [u].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([u].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit)
- ELSE NULL
END
FROM (
SELECT [g].[Nickname], [g].[LeaderNickname]
@@ -1733,7 +1720,6 @@ public override async Task Select_null_propagation_works_for_multiple_navigation
"""
SELECT CASE
WHEN [c].[Name] IS NOT NULL THEN [c].[Name]
- ELSE NULL
END
FROM [Tags] AS [t]
LEFT JOIN (
@@ -4855,7 +4841,6 @@ public override async Task Select_null_conditional_with_inheritance(bool async)
"""
SELECT CASE
WHEN [l].[CommanderName] IS NOT NULL THEN [l].[CommanderName]
- ELSE NULL
END
FROM [LocustHordes] AS [l]
""");
@@ -4869,7 +4854,6 @@ public override async Task Select_null_conditional_with_inheritance_negative(boo
"""
SELECT CASE
WHEN [l].[CommanderName] IS NOT NULL THEN [l].[Eradicated]
- ELSE NULL
END
FROM [LocustHordes] AS [l]
""");
@@ -8593,7 +8577,6 @@ public override async Task OrderBy_same_expression_containing_IsNull_correctly_d
"""
SELECT CASE
WHEN [u].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([u].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit)
- ELSE NULL
END
FROM (
SELECT [g].[Nickname], [g].[LeaderNickname]
@@ -8605,7 +8588,6 @@ FROM [Officers] AS [o]
ORDER BY CASE
WHEN CASE
WHEN [u].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([u].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit)
- ELSE NULL
END IS NOT NULL THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
@@ -10143,7 +10125,6 @@ public override async Task Join_inner_source_custom_projection_followed_by_filte
"""
SELECT CASE
WHEN [l1].[Name] = N'Locust' THEN CAST(1 AS bit)
- ELSE NULL
END AS [IsEradicated], [l1].[CommanderName], [l1].[Name]
FROM (
SELECT [l].[Name]
@@ -10155,10 +10136,8 @@ FROM [LocustCommanders] AS [l0]
INNER JOIN [LocustHordes] AS [l1] ON [u].[Name] = [l1].[CommanderName]
WHERE CASE
WHEN [l1].[Name] = N'Locust' THEN CAST(1 AS bit)
- ELSE NULL
END = CAST(0 AS bit) OR CASE
WHEN [l1].[Name] = N'Locust' THEN CAST(1 AS bit)
- ELSE NULL
END IS NULL
""");
}
@@ -10282,16 +10261,13 @@ UNION ALL
FROM [Officers] AS [o]
) AS [u]
WHERE CASE
- WHEN [u].[HasSoulPatch] = @__prm_0 THEN CASE
- WHEN (
- SELECT TOP(1) [w].[Name]
- FROM [Weapons] AS [w]
- WHERE [w].[Id] = [u].[SquadId]) = @__prm2_1 AND (
- SELECT TOP(1) [w].[Name]
- FROM [Weapons] AS [w]
- WHERE [w].[Id] = [u].[SquadId]) IS NOT NULL THEN CAST(1 AS bit)
- ELSE CAST(0 AS bit)
- END
+ WHEN [u].[HasSoulPatch] = @__prm_0 AND (
+ SELECT TOP(1) [w].[Name]
+ FROM [Weapons] AS [w]
+ WHERE [w].[Id] = [u].[SquadId]) = @__prm2_1 AND (
+ SELECT TOP(1) [w].[Name]
+ FROM [Weapons] AS [w]
+ WHERE [w].[Id] = [u].[SquadId]) IS NOT NULL THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END = CAST(1 AS bit)
""");
@@ -11413,7 +11389,6 @@ FROM [Officers] AS [o]
) AS [u] ON [t].[GearNickName] = [u].[Nickname] AND [t].[GearSquadId] = [u].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [u].[SquadId]
- ELSE NULL
END = 1
""");
}
@@ -11438,7 +11413,6 @@ FROM [Officers] AS [o]
) AS [u] ON [t].[GearNickName] = [u].[Nickname] AND [t].[GearSquadId] = [u].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [u].[SquadId]
- ELSE NULL
END + 1 = 2
""");
}
@@ -11451,7 +11425,6 @@ public override async Task Projecting_property_converted_to_nullable_with_additi
"""
SELECT [t].[Note], CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [u].[SquadId]
- ELSE NULL
END + 1 AS [Value]
FROM [Tags] AS [t]
LEFT JOIN (
@@ -11463,7 +11436,6 @@ FROM [Officers] AS [o]
) AS [u] ON [t].[GearNickName] = [u].[Nickname] AND [t].[GearSquadId] = [u].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [u].[Nickname]
- ELSE NULL
END IS NOT NULL
""");
}
@@ -11477,7 +11449,6 @@ public override async Task Projecting_property_converted_to_nullable_with_condit
SELECT CASE
WHEN [t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL THEN CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [u].[SquadId]
- ELSE NULL
END
ELSE -1
END
@@ -11500,7 +11471,6 @@ public override async Task Projecting_property_converted_to_nullable_with_functi
"""
SELECT SUBSTRING(CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [u].[Nickname]
- ELSE NULL
END, 0 + 1, 3)
FROM [Tags] AS [t]
LEFT JOIN (
@@ -11521,7 +11491,6 @@ public override async Task Projecting_property_converted_to_nullable_with_functi
"""
SELECT [t].[Note], SUBSTRING([t].[Note], 0 + 1, CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [u].[SquadId]
- ELSE NULL
END) AS [Function]
FROM [Tags] AS [t]
LEFT JOIN (
@@ -11533,7 +11502,6 @@ FROM [Officers] AS [o]
) AS [u] ON [t].[GearNickName] = [u].[Nickname] AND [t].[GearSquadId] = [u].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [u].[Nickname]
- ELSE NULL
END IS NOT NULL
""");
}
@@ -11546,13 +11514,10 @@ public override async Task Projecting_property_converted_to_nullable_into_elemen
"""
SELECT CASE
WHEN [t].[GearNickName] IS NOT NULL THEN CAST(LEN([u].[Nickname]) AS int)
- ELSE NULL
END, CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [u].[SquadId]
- ELSE NULL
END, CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [u].[SquadId]
- ELSE NULL
END + 1
FROM [Tags] AS [t]
LEFT JOIN (
@@ -11564,7 +11529,6 @@ FROM [Officers] AS [o]
) AS [u] ON [t].[GearNickName] = [u].[Nickname] AND [t].[GearSquadId] = [u].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [u].[Nickname]
- ELSE NULL
END IS NOT NULL
ORDER BY [t].[Note]
""");
@@ -11578,7 +11542,6 @@ public override async Task Projecting_property_converted_to_nullable_into_member
"""
SELECT CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [u].[SquadId]
- ELSE NULL
END AS [Id]
FROM [Tags] AS [t]
LEFT JOIN (
@@ -11590,7 +11553,6 @@ FROM [Officers] AS [o]
) AS [u] ON [t].[GearNickName] = [u].[Nickname] AND [t].[GearSquadId] = [u].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [u].[Nickname]
- ELSE NULL
END IS NOT NULL
ORDER BY [t].[Note]
""");
@@ -11604,13 +11566,10 @@ public override async Task Projecting_property_converted_to_nullable_into_new_ar
"""
SELECT CASE
WHEN [t].[GearNickName] IS NOT NULL THEN CAST(LEN([u].[Nickname]) AS int)
- ELSE NULL
END, CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [u].[SquadId]
- ELSE NULL
END, CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [u].[SquadId]
- ELSE NULL
END + 1
FROM [Tags] AS [t]
LEFT JOIN (
@@ -11622,7 +11581,6 @@ FROM [Officers] AS [o]
) AS [u] ON [t].[GearNickName] = [u].[Nickname] AND [t].[GearSquadId] = [u].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [u].[Nickname]
- ELSE NULL
END IS NOT NULL
ORDER BY [t].[Note]
""");
@@ -11645,10 +11603,8 @@ FROM [Officers] AS [o]
) AS [u] ON [t].[GearNickName] = [u].[Nickname] AND [t].[GearSquadId] = [u].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [u].[Nickname]
- ELSE NULL
END IS NOT NULL AND CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [u].[HasSoulPatch]
- ELSE NULL
END = CAST(0 AS bit)
ORDER BY [t].[Note]
""");
@@ -11694,11 +11650,9 @@ FROM [Officers] AS [o]
) AS [u] ON [t].[GearNickName] = [u].[Nickname] AND [t].[GearSquadId] = [u].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [u].[Nickname]
- ELSE NULL
END IS NOT NULL
ORDER BY CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [u].[SquadId]
- ELSE NULL
END, [t].[Note]
""");
}
diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/TPTGearsOfWarQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/TPTGearsOfWarQuerySqlServerTest.cs
index 2421b566d30..634064306f1 100644
--- a/test/EFCore.SqlServer.FunctionalTests/Query/TPTGearsOfWarQuerySqlServerTest.cs
+++ b/test/EFCore.SqlServer.FunctionalTests/Query/TPTGearsOfWarQuerySqlServerTest.cs
@@ -1163,10 +1163,8 @@ FROM [Gears] AS [g]
LEFT JOIN [Officers] AS [o] ON [g].[Nickname] = [o].[Nickname] AND [g].[SquadId] = [o].[SquadId]
WHERE CASE
WHEN [g].[LeaderNickname] IS NULL THEN NULL
- ELSE CASE
- WHEN [g].[LeaderNickname] LIKE N'%us' AND [g].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit)
- ELSE CAST(0 AS bit)
- END
+ WHEN [g].[LeaderNickname] LIKE N'%us' AND [g].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit)
+ ELSE CAST(0 AS bit)
END = CAST(1 AS bit)
""");
}
@@ -1188,7 +1186,6 @@ WHEN [g].[LeaderNickname] IS NOT NULL THEN CASE
WHEN [g].[LeaderNickname] LIKE N'%us' THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
- ELSE NULL
END = CAST(1 AS bit)
""");
}
@@ -1226,7 +1223,6 @@ FROM [Gears] AS [g]
LEFT JOIN [Officers] AS [o] ON [g].[Nickname] = [o].[Nickname] AND [g].[SquadId] = [o].[SquadId]
WHERE CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(LEN([g].[LeaderNickname]) AS int)
- ELSE NULL
END = 5
""");
}
@@ -1245,7 +1241,6 @@ FROM [Gears] AS [g]
LEFT JOIN [Officers] AS [o] ON [g].[Nickname] = [o].[Nickname] AND [g].[SquadId] = [o].[SquadId]
WHERE CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(LEN([g].[LeaderNickname]) AS int)
- ELSE NULL
END = 5
""");
}
@@ -1259,7 +1254,6 @@ public override async Task Select_null_propagation_optimization7(bool async)
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN [g].[LeaderNickname] + [g].[LeaderNickname]
- ELSE NULL
END
FROM [Gears] AS [g]
""");
@@ -1295,7 +1289,6 @@ public override async Task Select_null_propagation_negative1(bool async)
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit)
- ELSE NULL
END
FROM [Gears] AS [g]
""");
@@ -1309,7 +1302,6 @@ public override async Task Select_null_propagation_negative2(bool async)
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN [s].[LeaderNickname]
- ELSE NULL
END
FROM [Gears] AS [g]
CROSS JOIN (
@@ -1330,7 +1322,6 @@ WHEN [s].[Nickname] IS NOT NULL AND [s].[SquadId] IS NOT NULL THEN CASE
WHEN [s].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
- ELSE NULL
END AS [Condition]
FROM [Gears] AS [g]
LEFT JOIN (
@@ -1387,7 +1378,6 @@ public override async Task Select_null_propagation_negative6(bool async)
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(0 AS bit)
- ELSE NULL
END
FROM [Gears] AS [g]
""");
@@ -1401,7 +1391,6 @@ public override async Task Select_null_propagation_negative7(bool async)
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit)
- ELSE NULL
END
FROM [Gears] AS [g]
""");
@@ -1415,7 +1404,6 @@ public override async Task Select_null_propagation_negative8(bool async)
"""
SELECT CASE
WHEN [s0].[Id] IS NOT NULL THEN [c].[Name]
- ELSE NULL
END
FROM [Tags] AS [t]
LEFT JOIN (
@@ -1435,7 +1423,6 @@ public override async Task Select_null_propagation_negative9(bool async)
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit)
- ELSE NULL
END
FROM [Gears] AS [g]
""");
@@ -1464,7 +1451,6 @@ public override async Task Select_null_propagation_works_for_multiple_navigation
"""
SELECT CASE
WHEN [c].[Name] IS NOT NULL THEN [c].[Name]
- ELSE NULL
END
FROM [Tags] AS [t]
LEFT JOIN (
@@ -4147,7 +4133,6 @@ public override async Task Select_null_conditional_with_inheritance(bool async)
"""
SELECT CASE
WHEN [l].[CommanderName] IS NOT NULL THEN [l].[CommanderName]
- ELSE NULL
END
FROM [Factions] AS [f]
LEFT JOIN [LocustHordes] AS [l] ON [f].[Id] = [l].[Id]
@@ -4163,7 +4148,6 @@ public override async Task Select_null_conditional_with_inheritance_negative(boo
"""
SELECT CASE
WHEN [l].[CommanderName] IS NOT NULL THEN [l].[Eradicated]
- ELSE NULL
END
FROM [Factions] AS [f]
LEFT JOIN [LocustHordes] AS [l] ON [f].[Id] = [l].[Id]
@@ -7198,13 +7182,11 @@ public override async Task OrderBy_same_expression_containing_IsNull_correctly_d
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit)
- ELSE NULL
END
FROM [Gears] AS [g]
ORDER BY CASE
WHEN CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit)
- ELSE NULL
END IS NOT NULL THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
@@ -7826,10 +7808,7 @@ FROM [LocustLeaders] AS [l0]
INNER JOIN [LocustCommanders] AS [l1] ON [l0].[Name] = [l1].[Name]
) AS [s] ON [l].[CommanderName] = [s].[Name]
WHERE CASE
- WHEN [l].[Id] IS NOT NULL THEN CASE
- WHEN [s].[Name] IS NOT NULL THEN CAST(1 AS bit)
- ELSE CAST(0 AS bit)
- END
+ WHEN [l].[Id] IS NOT NULL AND [s].[Name] IS NOT NULL THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END = CAST(1 AS bit)
""");
@@ -8613,7 +8592,6 @@ public override async Task Join_inner_source_custom_projection_followed_by_filte
"""
SELECT CASE
WHEN [s].[Name] = N'Locust' THEN CAST(1 AS bit)
- ELSE NULL
END AS [IsEradicated], [s].[CommanderName], [s].[Name]
FROM [LocustLeaders] AS [l]
INNER JOIN (
@@ -8624,10 +8602,8 @@ WHERE [l0].[Id] IS NOT NULL
) AS [s] ON [l].[Name] = [s].[CommanderName]
WHERE CASE
WHEN [s].[Name] = N'Locust' THEN CAST(1 AS bit)
- ELSE NULL
END = CAST(0 AS bit) OR CASE
WHEN [s].[Name] = N'Locust' THEN CAST(1 AS bit)
- ELSE NULL
END IS NULL
""");
}
@@ -8745,16 +8721,13 @@ END AS [Discriminator]
FROM [Gears] AS [g]
LEFT JOIN [Officers] AS [o] ON [g].[Nickname] = [o].[Nickname] AND [g].[SquadId] = [o].[SquadId]
WHERE CASE
- WHEN [g].[HasSoulPatch] = @__prm_0 THEN CASE
- WHEN (
- SELECT TOP(1) [w].[Name]
- FROM [Weapons] AS [w]
- WHERE [w].[Id] = [g].[SquadId]) = @__prm2_1 AND (
- SELECT TOP(1) [w].[Name]
- FROM [Weapons] AS [w]
- WHERE [w].[Id] = [g].[SquadId]) IS NOT NULL THEN CAST(1 AS bit)
- ELSE CAST(0 AS bit)
- END
+ WHEN [g].[HasSoulPatch] = @__prm_0 AND (
+ SELECT TOP(1) [w].[Name]
+ FROM [Weapons] AS [w]
+ WHERE [w].[Id] = [g].[SquadId]) = @__prm2_1 AND (
+ SELECT TOP(1) [w].[Name]
+ FROM [Weapons] AS [w]
+ WHERE [w].[Id] = [g].[SquadId]) IS NOT NULL THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END = CAST(1 AS bit)
""");
@@ -9668,7 +9641,6 @@ FROM [Gears] AS [g]
) AS [s] ON [t].[GearNickName] = [s].[Nickname] AND [t].[GearSquadId] = [s].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [s].[SquadId]
- ELSE NULL
END = 1
""");
}
@@ -9690,7 +9662,6 @@ FROM [Gears] AS [g]
) AS [s] ON [t].[GearNickName] = [s].[Nickname] AND [t].[GearSquadId] = [s].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [s].[SquadId]
- ELSE NULL
END + 1 = 2
""");
}
@@ -9703,7 +9674,6 @@ public override async Task Projecting_property_converted_to_nullable_with_additi
"""
SELECT [t].[Note], CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [s].[SquadId]
- ELSE NULL
END + 1 AS [Value]
FROM [Tags] AS [t]
LEFT JOIN (
@@ -9712,7 +9682,6 @@ FROM [Gears] AS [g]
) AS [s] ON [t].[GearNickName] = [s].[Nickname] AND [t].[GearSquadId] = [s].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [s].[Nickname]
- ELSE NULL
END IS NOT NULL
""");
}
@@ -9726,7 +9695,6 @@ public override async Task Projecting_property_converted_to_nullable_with_condit
SELECT CASE
WHEN [t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL THEN CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [s].[SquadId]
- ELSE NULL
END
ELSE -1
END
@@ -9746,7 +9714,6 @@ public override async Task Projecting_property_converted_to_nullable_with_functi
"""
SELECT SUBSTRING(CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [s].[Nickname]
- ELSE NULL
END, 0 + 1, 3)
FROM [Tags] AS [t]
LEFT JOIN (
@@ -9764,7 +9731,6 @@ public override async Task Projecting_property_converted_to_nullable_with_functi
"""
SELECT [t].[Note], SUBSTRING([t].[Note], 0 + 1, CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [s].[SquadId]
- ELSE NULL
END) AS [Function]
FROM [Tags] AS [t]
LEFT JOIN (
@@ -9773,7 +9739,6 @@ FROM [Gears] AS [g]
) AS [s] ON [t].[GearNickName] = [s].[Nickname] AND [t].[GearSquadId] = [s].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [s].[Nickname]
- ELSE NULL
END IS NOT NULL
""");
}
@@ -9786,13 +9751,10 @@ public override async Task Projecting_property_converted_to_nullable_into_elemen
"""
SELECT CASE
WHEN [t].[GearNickName] IS NOT NULL THEN CAST(LEN([s].[Nickname]) AS int)
- ELSE NULL
END, CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [s].[SquadId]
- ELSE NULL
END, CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [s].[SquadId]
- ELSE NULL
END + 1
FROM [Tags] AS [t]
LEFT JOIN (
@@ -9801,7 +9763,6 @@ FROM [Gears] AS [g]
) AS [s] ON [t].[GearNickName] = [s].[Nickname] AND [t].[GearSquadId] = [s].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [s].[Nickname]
- ELSE NULL
END IS NOT NULL
ORDER BY [t].[Note]
""");
@@ -9815,7 +9776,6 @@ public override async Task Projecting_property_converted_to_nullable_into_member
"""
SELECT CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [s].[SquadId]
- ELSE NULL
END AS [Id]
FROM [Tags] AS [t]
LEFT JOIN (
@@ -9824,7 +9784,6 @@ FROM [Gears] AS [g]
) AS [s] ON [t].[GearNickName] = [s].[Nickname] AND [t].[GearSquadId] = [s].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [s].[Nickname]
- ELSE NULL
END IS NOT NULL
ORDER BY [t].[Note]
""");
@@ -9838,13 +9797,10 @@ public override async Task Projecting_property_converted_to_nullable_into_new_ar
"""
SELECT CASE
WHEN [t].[GearNickName] IS NOT NULL THEN CAST(LEN([s].[Nickname]) AS int)
- ELSE NULL
END, CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [s].[SquadId]
- ELSE NULL
END, CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [s].[SquadId]
- ELSE NULL
END + 1
FROM [Tags] AS [t]
LEFT JOIN (
@@ -9853,7 +9809,6 @@ FROM [Gears] AS [g]
) AS [s] ON [t].[GearNickName] = [s].[Nickname] AND [t].[GearSquadId] = [s].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [s].[Nickname]
- ELSE NULL
END IS NOT NULL
ORDER BY [t].[Note]
""");
@@ -9873,10 +9828,8 @@ FROM [Gears] AS [g]
) AS [s] ON [t].[GearNickName] = [s].[Nickname] AND [t].[GearSquadId] = [s].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [s].[Nickname]
- ELSE NULL
END IS NOT NULL AND CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [s].[HasSoulPatch]
- ELSE NULL
END = CAST(0 AS bit)
ORDER BY [t].[Note]
""");
@@ -9913,11 +9866,9 @@ FROM [Gears] AS [g]
) AS [s] ON [t].[GearNickName] = [s].[Nickname] AND [t].[GearSquadId] = [s].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [s].[Nickname]
- ELSE NULL
END IS NOT NULL
ORDER BY CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [s].[SquadId]
- ELSE NULL
END, [t].[Note]
""");
}
diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/TemporalComplexNavigationsCollectionsQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/TemporalComplexNavigationsCollectionsQuerySqlServerTest.cs
index 655af6b5543..7115c32d5ee 100644
--- a/test/EFCore.SqlServer.FunctionalTests/Query/TemporalComplexNavigationsCollectionsQuerySqlServerTest.cs
+++ b/test/EFCore.SqlServer.FunctionalTests/Query/TemporalComplexNavigationsCollectionsQuerySqlServerTest.cs
@@ -3010,7 +3010,6 @@ public override async Task Project_collection_and_nested_conditional(bool async)
WHEN [l].[Id] = 1 THEN N'01'
WHEN [l].[Id] = 2 THEN N'02'
WHEN [l].[Id] = 3 THEN N'03'
- ELSE NULL
END
FROM [LevelOne] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [l]
LEFT JOIN [LevelTwo] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [l0] ON [l].[Id] = [l0].[OneToMany_Optional_Inverse2Id]
@@ -3018,7 +3017,6 @@ WHERE CASE
WHEN [l].[Id] = 1 THEN N'01'
WHEN [l].[Id] = 2 THEN N'02'
WHEN [l].[Id] = 3 THEN N'03'
- ELSE NULL
END = N'02'
ORDER BY [l].[Id], [l0].[Id]
""");
diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/TemporalGearsOfWarQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/TemporalGearsOfWarQuerySqlServerTest.cs
index 5d33396a945..a7b9ce28a68 100644
--- a/test/EFCore.SqlServer.FunctionalTests/Query/TemporalGearsOfWarQuerySqlServerTest.cs
+++ b/test/EFCore.SqlServer.FunctionalTests/Query/TemporalGearsOfWarQuerySqlServerTest.cs
@@ -754,7 +754,6 @@ WHEN [g0].[Nickname] IS NOT NULL AND [g0].[SquadId] IS NOT NULL THEN CASE
WHEN [g0].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
- ELSE NULL
END AS [Condition]
FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g]
LEFT JOIN [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g0] ON [g].[HasSoulPatch] = CAST(1 AS bit)
@@ -809,19 +808,15 @@ public override async Task Projecting_property_converted_to_nullable_into_elemen
"""
SELECT CASE
WHEN [t].[GearNickName] IS NOT NULL THEN CAST(LEN([g].[Nickname]) AS int)
- ELSE NULL
END, CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId]
- ELSE NULL
END, CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId]
- ELSE NULL
END + 1
FROM [Tags] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [t]
LEFT JOIN [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname]
- ELSE NULL
END IS NOT NULL
ORDER BY [t].[Note]
""");
@@ -1223,7 +1218,6 @@ public override async Task Projecting_property_converted_to_nullable_with_condit
SELECT CASE
WHEN [t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL THEN CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId]
- ELSE NULL
END
ELSE -1
END
@@ -1315,13 +1309,11 @@ public override async Task Projecting_property_converted_to_nullable_with_additi
"""
SELECT [t].[Note], CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId]
- ELSE NULL
END + 1 AS [Value]
FROM [Tags] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [t]
LEFT JOIN [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname]
- ELSE NULL
END IS NOT NULL
""");
}
@@ -1457,16 +1449,13 @@ public override async Task Conditional_expression_with_test_being_simplified_to_
SELECT [g].[Nickname], [g].[SquadId], [g].[AssignedCityName], [g].[CityOfBirthName], [g].[Discriminator], [g].[FullName], [g].[HasSoulPatch], [g].[LeaderNickname], [g].[LeaderSquadId], [g].[PeriodEnd], [g].[PeriodStart], [g].[Rank]
FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g]
WHERE CASE
- WHEN [g].[HasSoulPatch] = @__prm_0 THEN CASE
- WHEN (
- SELECT TOP(1) [w].[Name]
- FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w]
- WHERE [w].[Id] = [g].[SquadId]) = @__prm2_1 AND (
- SELECT TOP(1) [w].[Name]
- FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w]
- WHERE [w].[Id] = [g].[SquadId]) IS NOT NULL THEN CAST(1 AS bit)
- ELSE CAST(0 AS bit)
- END
+ WHEN [g].[HasSoulPatch] = @__prm_0 AND (
+ SELECT TOP(1) [w].[Name]
+ FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w]
+ WHERE [w].[Id] = [g].[SquadId]) = @__prm2_1 AND (
+ SELECT TOP(1) [w].[Name]
+ FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w]
+ WHERE [w].[Id] = [g].[SquadId]) IS NOT NULL THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END = CAST(1 AS bit)
""");
@@ -1604,7 +1593,6 @@ public override async Task Null_propagation_optimization6(bool async)
FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g]
WHERE CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(LEN([g].[LeaderNickname]) AS int)
- ELSE NULL
END = 5
""");
}
@@ -1786,7 +1774,6 @@ public override async Task Select_null_propagation_negative6(bool async)
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(0 AS bit)
- ELSE NULL
END
FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g]
""");
@@ -2029,7 +2016,6 @@ public override async Task Select_null_propagation_negative7(bool async)
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit)
- ELSE NULL
END
FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g]
""");
@@ -2563,7 +2549,6 @@ public override async Task Select_null_propagation_negative1(bool async)
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit)
- ELSE NULL
END
FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g]
""");
@@ -2577,16 +2562,13 @@ public override async Task Join_inner_source_custom_projection_followed_by_filte
"""
SELECT CASE
WHEN [f].[Name] = N'Locust' THEN CAST(1 AS bit)
- ELSE NULL
END AS [IsEradicated], [f].[CommanderName], [f].[Name]
FROM [LocustLeaders] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [l]
INNER JOIN [Factions] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [f] ON [l].[Name] = [f].[CommanderName]
WHERE CASE
WHEN [f].[Name] = N'Locust' THEN CAST(1 AS bit)
- ELSE NULL
END = CAST(0 AS bit) OR CASE
WHEN [f].[Name] = N'Locust' THEN CAST(1 AS bit)
- ELSE NULL
END IS NULL
""");
}
@@ -2658,7 +2640,6 @@ public override async Task Select_null_propagation_negative9(bool async)
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit)
- ELSE NULL
END
FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g]
""");
@@ -2692,7 +2673,6 @@ ELSE CAST(0 AS bit)
LEFT JOIN [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId]
- ELSE NULL
END + 1 = 2
""");
}
@@ -2811,7 +2791,6 @@ ELSE CAST(0 AS bit)
LEFT JOIN [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId]
- ELSE NULL
END = 1
""");
}
@@ -3093,19 +3072,15 @@ public override async Task Projecting_property_converted_to_nullable_into_new_ar
"""
SELECT CASE
WHEN [t].[GearNickName] IS NOT NULL THEN CAST(LEN([g].[Nickname]) AS int)
- ELSE NULL
END, CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId]
- ELSE NULL
END, CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId]
- ELSE NULL
END + 1
FROM [Tags] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [t]
LEFT JOIN [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname]
- ELSE NULL
END IS NOT NULL
ORDER BY [t].[Note]
""");
@@ -3284,7 +3259,6 @@ public override async Task Projecting_property_converted_to_nullable_with_functi
"""
SELECT SUBSTRING(CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname]
- ELSE NULL
END, 0 + 1, 3)
FROM [Tags] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [t]
LEFT JOIN [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
@@ -4028,7 +4002,6 @@ public override async Task Null_propagation_optimization5(bool async)
FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g]
WHERE CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(LEN([g].[LeaderNickname]) AS int)
- ELSE NULL
END = 5
""");
}
@@ -4913,13 +4886,11 @@ public override async Task Projecting_property_converted_to_nullable_into_member
"""
SELECT CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId]
- ELSE NULL
END AS [Id]
FROM [Tags] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [t]
LEFT JOIN [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname]
- ELSE NULL
END IS NOT NULL
ORDER BY [t].[Note]
""");
@@ -5163,7 +5134,6 @@ public override async Task Select_null_propagation_optimization7(bool async)
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN [g].[LeaderNickname] + [g].[LeaderNickname]
- ELSE NULL
END
FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g]
""");
@@ -5272,11 +5242,9 @@ ELSE CAST(0 AS bit)
LEFT JOIN [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname]
- ELSE NULL
END IS NOT NULL
ORDER BY CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId]
- ELSE NULL
END, [t].[Note]
""");
}
@@ -5493,7 +5461,6 @@ public override async Task Select_null_propagation_negative8(bool async)
"""
SELECT CASE
WHEN [s].[Id] IS NOT NULL THEN [c].[Name]
- ELSE NULL
END
FROM [Tags] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [t]
LEFT JOIN [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
@@ -5830,7 +5797,6 @@ public override async Task Select_null_propagation_works_for_multiple_navigation
"""
SELECT CASE
WHEN [c].[Name] IS NOT NULL THEN [c].[Name]
- ELSE NULL
END
FROM [Tags] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [t]
LEFT JOIN [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
@@ -6583,13 +6549,11 @@ public override async Task Projecting_property_converted_to_nullable_with_functi
"""
SELECT [t].[Note], SUBSTRING([t].[Note], 0 + 1, CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId]
- ELSE NULL
END) AS [Function]
FROM [Tags] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [t]
LEFT JOIN [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname]
- ELSE NULL
END IS NOT NULL
""");
}
@@ -7063,7 +7027,6 @@ public override async Task Select_null_conditional_with_inheritance_negative(boo
"""
SELECT CASE
WHEN [f].[CommanderName] IS NOT NULL THEN [f].[Eradicated]
- ELSE NULL
END
FROM [Factions] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [f]
""");
@@ -7805,10 +7768,8 @@ public override async Task Null_propagation_optimization2(bool async)
FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g]
WHERE CASE
WHEN [g].[LeaderNickname] IS NULL THEN NULL
- ELSE CASE
- WHEN [g].[LeaderNickname] LIKE N'%us' AND [g].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit)
- ELSE CAST(0 AS bit)
- END
+ WHEN [g].[LeaderNickname] LIKE N'%us' AND [g].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit)
+ ELSE CAST(0 AS bit)
END = CAST(1 AS bit)
""");
}
@@ -7867,7 +7828,6 @@ public override async Task Select_null_conditional_with_inheritance(bool async)
"""
SELECT CASE
WHEN [f].[CommanderName] IS NOT NULL THEN [f].[CommanderName]
- ELSE NULL
END
FROM [Factions] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [f]
""");
@@ -8318,13 +8278,11 @@ public override async Task OrderBy_same_expression_containing_IsNull_correctly_d
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit)
- ELSE NULL
END
FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g]
ORDER BY CASE
WHEN CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit)
- ELSE NULL
END IS NOT NULL THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
@@ -9204,7 +9162,6 @@ public override async Task Select_null_propagation_negative2(bool async)
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN [g0].[LeaderNickname]
- ELSE NULL
END
FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g]
CROSS JOIN [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g0]
@@ -9308,10 +9265,8 @@ SELECT [t].[Note]
LEFT JOIN [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId]
WHERE CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname]
- ELSE NULL
END IS NOT NULL AND CASE
WHEN [t].[GearNickName] IS NOT NULL THEN [g].[HasSoulPatch]
- ELSE NULL
END = CAST(0 AS bit)
ORDER BY [t].[Note]
""");
@@ -9400,7 +9355,6 @@ WHEN [g].[LeaderNickname] IS NOT NULL THEN CASE
WHEN [g].[LeaderNickname] LIKE N'%us' THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
- ELSE NULL
END = CAST(1 AS bit)
""");
}
diff --git a/test/EFCore.Sqlite.FunctionalTests/Query/GearsOfWarQuerySqliteTest.cs b/test/EFCore.Sqlite.FunctionalTests/Query/GearsOfWarQuerySqliteTest.cs
index e6bb1577742..cddc6d96f46 100644
--- a/test/EFCore.Sqlite.FunctionalTests/Query/GearsOfWarQuerySqliteTest.cs
+++ b/test/EFCore.Sqlite.FunctionalTests/Query/GearsOfWarQuerySqliteTest.cs
@@ -1065,7 +1065,6 @@ public override async Task Null_propagation_optimization6(bool async)
FROM "Gears" AS "g"
WHERE CASE
WHEN "g"."LeaderNickname" IS NOT NULL THEN length("g"."LeaderNickname")
- ELSE NULL
END = 5
""");
}
@@ -1562,7 +1561,6 @@ public override async Task Null_propagation_optimization3(bool async)
FROM "Gears" AS "g"
WHERE CASE
WHEN "g"."LeaderNickname" IS NOT NULL THEN "g"."LeaderNickname" LIKE '%us'
- ELSE NULL
END
""");
}
@@ -1772,7 +1770,6 @@ public override async Task Select_null_propagation_negative1(bool async)
"""
SELECT CASE
WHEN "g"."LeaderNickname" IS NOT NULL THEN length("g"."Nickname") = 5
- ELSE NULL
END
FROM "Gears" AS "g"
""");
@@ -2269,10 +2266,8 @@ public override async Task Projecting_property_converted_to_nullable_into_unary(
LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId"
WHERE CASE
WHEN "t"."GearNickName" IS NOT NULL THEN "g"."Nickname"
- ELSE NULL
END IS NOT NULL AND NOT (CASE
WHEN "t"."GearNickName" IS NOT NULL THEN "g"."HasSoulPatch"
- ELSE NULL
END)
ORDER BY "t"."Note"
""");
@@ -2395,7 +2390,6 @@ public override async Task Projecting_property_converted_to_nullable_with_functi
"""
SELECT substr(CASE
WHEN "t"."GearNickName" IS NOT NULL THEN "g"."Nickname"
- ELSE NULL
END, 0 + 1, 3)
FROM "Tags" AS "t"
LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId"
@@ -2738,7 +2732,6 @@ public override async Task Projecting_property_converted_to_nullable_with_additi
LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId"
WHERE CASE
WHEN "t"."GearNickName" IS NOT NULL THEN "g"."SquadId"
- ELSE NULL
END + 1 = 2
""");
}
@@ -2876,16 +2869,13 @@ public override async Task Join_inner_source_custom_projection_followed_by_filte
"""
SELECT CASE
WHEN "f"."Name" = 'Locust' THEN 1
- ELSE NULL
END AS "IsEradicated", "f"."CommanderName", "f"."Name"
FROM "LocustLeaders" AS "l"
INNER JOIN "Factions" AS "f" ON "l"."Name" = "f"."CommanderName"
WHERE CASE
WHEN "f"."Name" = 'Locust' THEN 1
- ELSE NULL
END = 0 OR CASE
WHEN "f"."Name" = 'Locust' THEN 1
- ELSE NULL
END IS NULL
""");
}
@@ -3012,13 +3002,11 @@ public override async Task Projecting_property_converted_to_nullable_into_member
"""
SELECT CASE
WHEN "t"."GearNickName" IS NOT NULL THEN "g"."SquadId"
- ELSE NULL
END AS "Id"
FROM "Tags" AS "t"
LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId"
WHERE CASE
WHEN "t"."GearNickName" IS NOT NULL THEN "g"."Nickname"
- ELSE NULL
END IS NOT NULL
ORDER BY "t"."Note"
""");
@@ -3205,7 +3193,6 @@ public override async Task Select_null_propagation_works_for_multiple_navigation
"""
SELECT CASE
WHEN "c"."Name" IS NOT NULL THEN "c"."Name"
- ELSE NULL
END
FROM "Tags" AS "t"
LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId"
@@ -3313,7 +3300,6 @@ public override async Task Select_null_propagation_negative9(bool async)
"""
SELECT CASE
WHEN "g"."LeaderNickname" IS NOT NULL THEN length("g"."Nickname") = 5
- ELSE NULL
END
FROM "Gears" AS "g"
""");
@@ -3647,19 +3633,15 @@ public override async Task Projecting_property_converted_to_nullable_into_elemen
"""
SELECT CASE
WHEN "t"."GearNickName" IS NOT NULL THEN length("g"."Nickname")
- ELSE NULL
END, CASE
WHEN "t"."GearNickName" IS NOT NULL THEN "g"."SquadId"
- ELSE NULL
END, CASE
WHEN "t"."GearNickName" IS NOT NULL THEN "g"."SquadId"
- ELSE NULL
END + 1
FROM "Tags" AS "t"
LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId"
WHERE CASE
WHEN "t"."GearNickName" IS NOT NULL THEN "g"."Nickname"
- ELSE NULL
END IS NOT NULL
ORDER BY "t"."Note"
""");
@@ -3846,7 +3828,6 @@ public override async Task Select_null_propagation_negative6(bool async)
"""
SELECT CASE
WHEN "g"."LeaderNickname" IS NOT NULL THEN 0
- ELSE NULL
END
FROM "Gears" AS "g"
""");
@@ -4616,7 +4597,6 @@ public override async Task Projecting_property_converted_to_nullable_with_compar
LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId"
WHERE CASE
WHEN "t"."GearNickName" IS NOT NULL THEN "g"."SquadId"
- ELSE NULL
END = 1
""");
}
@@ -4856,13 +4836,11 @@ public override async Task Projecting_property_converted_to_nullable_with_functi
"""
SELECT "t"."Note", substr("t"."Note", 0 + 1, CASE
WHEN "t"."GearNickName" IS NOT NULL THEN "g"."SquadId"
- ELSE NULL
END) AS "Function"
FROM "Tags" AS "t"
LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId"
WHERE CASE
WHEN "t"."GearNickName" IS NOT NULL THEN "g"."Nickname"
- ELSE NULL
END IS NOT NULL
""");
}
@@ -4990,19 +4968,15 @@ public override async Task Projecting_property_converted_to_nullable_into_new_ar
"""
SELECT CASE
WHEN "t"."GearNickName" IS NOT NULL THEN length("g"."Nickname")
- ELSE NULL
END, CASE
WHEN "t"."GearNickName" IS NOT NULL THEN "g"."SquadId"
- ELSE NULL
END, CASE
WHEN "t"."GearNickName" IS NOT NULL THEN "g"."SquadId"
- ELSE NULL
END + 1
FROM "Tags" AS "t"
LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId"
WHERE CASE
WHEN "t"."GearNickName" IS NOT NULL THEN "g"."Nickname"
- ELSE NULL
END IS NOT NULL
ORDER BY "t"."Note"
""");
@@ -5289,7 +5263,6 @@ public override async Task Select_null_propagation_negative3(bool async)
"""
SELECT "g0"."Nickname", CASE
WHEN "g0"."Nickname" IS NOT NULL AND "g0"."SquadId" IS NOT NULL THEN "g0"."LeaderNickname" IS NOT NULL
- ELSE NULL
END AS "Condition"
FROM "Gears" AS "g"
LEFT JOIN "Gears" AS "g0" ON "g"."HasSoulPatch"
@@ -5642,7 +5615,6 @@ public override async Task Select_null_propagation_negative8(bool async)
"""
SELECT CASE
WHEN "s"."Id" IS NOT NULL THEN "c"."Name"
- ELSE NULL
END
FROM "Tags" AS "t"
LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId"
@@ -5820,7 +5792,6 @@ public override async Task Select_null_propagation_optimization7(bool async)
"""
SELECT CASE
WHEN "g"."LeaderNickname" IS NOT NULL THEN "g"."LeaderNickname" || "g"."LeaderNickname"
- ELSE NULL
END
FROM "Gears" AS "g"
""");
@@ -6471,7 +6442,6 @@ public override async Task Select_null_conditional_with_inheritance(bool async)
"""
SELECT CASE
WHEN "f"."CommanderName" IS NOT NULL THEN "f"."CommanderName"
- ELSE NULL
END
FROM "Factions" AS "f"
""");
@@ -6732,11 +6702,9 @@ public override async Task Projecting_property_converted_to_nullable_and_use_it_
LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId"
WHERE CASE
WHEN "t"."GearNickName" IS NOT NULL THEN "g"."Nickname"
- ELSE NULL
END IS NOT NULL
ORDER BY CASE
WHEN "t"."GearNickName" IS NOT NULL THEN "g"."SquadId"
- ELSE NULL
END, "t"."Note"
""");
}
@@ -7417,7 +7385,6 @@ public override async Task Select_null_propagation_negative7(bool async)
"""
SELECT CASE
WHEN "g"."LeaderNickname" IS NOT NULL THEN 1
- ELSE NULL
END
FROM "Gears" AS "g"
""");
@@ -7552,7 +7519,6 @@ public override async Task Null_propagation_optimization5(bool async)
FROM "Gears" AS "g"
WHERE CASE
WHEN "g"."LeaderNickname" IS NOT NULL THEN length("g"."LeaderNickname")
- ELSE NULL
END = 5
""");
}
@@ -8144,13 +8110,11 @@ public override async Task Projecting_property_converted_to_nullable_with_additi
"""
SELECT "t"."Note", CASE
WHEN "t"."GearNickName" IS NOT NULL THEN "g"."SquadId"
- ELSE NULL
END + 1 AS "Value"
FROM "Tags" AS "t"
LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId"
WHERE CASE
WHEN "t"."GearNickName" IS NOT NULL THEN "g"."Nickname"
- ELSE NULL
END IS NOT NULL
""");
}
@@ -8182,7 +8146,6 @@ public override async Task Select_null_conditional_with_inheritance_negative(boo
"""
SELECT CASE
WHEN "f"."CommanderName" IS NOT NULL THEN "f"."Eradicated"
- ELSE NULL
END
FROM "Factions" AS "f"
""");
@@ -8226,12 +8189,10 @@ public override async Task OrderBy_same_expression_containing_IsNull_correctly_d
"""
SELECT CASE
WHEN "g"."LeaderNickname" IS NOT NULL THEN length("g"."Nickname") = 5
- ELSE NULL
END
FROM "Gears" AS "g"
ORDER BY CASE
WHEN "g"."LeaderNickname" IS NOT NULL THEN length("g"."Nickname") = 5
- ELSE NULL
END IS NOT NULL
""");
}
@@ -8635,7 +8596,6 @@ public override async Task Select_null_propagation_negative2(bool async)
"""
SELECT CASE
WHEN "g"."LeaderNickname" IS NOT NULL THEN "g0"."LeaderNickname"
- ELSE NULL
END
FROM "Gears" AS "g"
CROSS JOIN "Gears" AS "g0"
@@ -8934,7 +8894,6 @@ public override async Task Projecting_property_converted_to_nullable_with_condit
SELECT CASE
WHEN "t"."Note" <> 'K.I.A.' OR "t"."Note" IS NULL THEN CASE
WHEN "t"."GearNickName" IS NOT NULL THEN "g"."SquadId"
- ELSE NULL
END
ELSE -1
END