From 38c79bff4a64218da73c4d2e0e8b3a7eda0773b8 Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Thu, 18 Jul 2019 18:38:15 +0200 Subject: [PATCH] Ignore convert nodes from nullable to non-nullable Fixes #16653 --- .../RelationalSqlTranslatingExpressionVisitor.cs | 2 +- .../Query/SimpleQueryTestBase.cs | 9 +++++++++ .../Query/SimpleQuerySqlServerTest.cs | 11 +++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/EFCore.Relational/Query/Pipeline/RelationalSqlTranslatingExpressionVisitor.cs b/src/EFCore.Relational/Query/Pipeline/RelationalSqlTranslatingExpressionVisitor.cs index 40a78652d37..33a5c706f6f 100644 --- a/src/EFCore.Relational/Query/Pipeline/RelationalSqlTranslatingExpressionVisitor.cs +++ b/src/EFCore.Relational/Query/Pipeline/RelationalSqlTranslatingExpressionVisitor.cs @@ -540,7 +540,7 @@ protected override Expression VisitUnary(UnaryExpression unaryExpression) // Object convert needs to be converted to explicit cast when mismatching types if (operand.Type.IsInterface && unaryExpression.Type.GetInterfaces().Any(e => e == operand.Type) - || unaryExpression.Type.UnwrapNullableType() == operand.Type + || unaryExpression.Type.UnwrapNullableType() == operand.Type.UnwrapNullableType() || unaryExpression.Type.UnwrapNullableType() == typeof(Enum)) { return sqlOperand; diff --git a/test/EFCore.Specification.Tests/Query/SimpleQueryTestBase.cs b/test/EFCore.Specification.Tests/Query/SimpleQueryTestBase.cs index e008446554b..58f2333596a 100644 --- a/test/EFCore.Specification.Tests/Query/SimpleQueryTestBase.cs +++ b/test/EFCore.Specification.Tests/Query/SimpleQueryTestBase.cs @@ -5989,5 +5989,14 @@ public virtual Task Inner_parameter_in_nested_lambdas_gets_preserved(bool isAsyn cs => cs.Where(c => c.Orders.Where(o => c == new Customer { CustomerID = o.CustomerID }).Count() > 0), entryCount: 89); } + + [ConditionalTheory] + [MemberData(nameof(IsAsyncData))] + public virtual Task Convert_to_nullable_on_nullable_value_is_ignored(bool isAsync) + { + return AssertQuery( + isAsync, + os => os.Select(o => new Order { OrderDate = o.OrderDate.Value })); + } } } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/SimpleQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/SimpleQuerySqlServerTest.cs index 371628c2358..75d3be4ef73 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/SimpleQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/SimpleQuerySqlServerTest.cs @@ -4877,6 +4877,17 @@ FROM [Orders] AS [o] WHERE (([c].[CustomerID] = [o].[CustomerID]) AND [o].[CustomerID] IS NOT NULL) AND (([c].[CustomerID] = [o].[CustomerID]) AND [o].[CustomerID] IS NOT NULL)) > 0"); } + [ConditionalTheory] + [MemberData(nameof(IsAsyncData))] + public override async Task Convert_to_nullable_on_nullable_value_is_ignored(bool isAsync) + { + await base.Convert_to_nullable_on_nullable_value_is_ignored(isAsync); + + AssertSql( + @"SELECT [o].[OrderDate] +FROM [Orders] AS [o]"); + } + private void AssertSql(params string[] expected) => Fixture.TestSqlLoggerFactory.AssertBaseline(expected);