diff --git a/src/EFCore.SqlServer/Query/Internal/SqlServerObjectToStringTranslator.cs b/src/EFCore.SqlServer/Query/Internal/SqlServerObjectToStringTranslator.cs index 32c288ac643..bb620154f54 100644 --- a/src/EFCore.SqlServer/Query/Internal/SqlServerObjectToStringTranslator.cs +++ b/src/EFCore.SqlServer/Query/Internal/SqlServerObjectToStringTranslator.cs @@ -67,7 +67,7 @@ public SqlServerObjectToStringTranslator(ISqlExpressionFactory sqlExpressionFact return null; } - if(instance.TypeMapping is not null && instance.TypeMapping.ClrType == typeof(string)) + if (instance.TypeMapping?.ClrType == typeof(string)) { return instance; } diff --git a/src/EFCore.Sqlite.Core/Query/Internal/SqliteObjectToStringTranslator.cs b/src/EFCore.Sqlite.Core/Query/Internal/SqliteObjectToStringTranslator.cs index 3583c43f1cb..44e1cc2ac2a 100644 --- a/src/EFCore.Sqlite.Core/Query/Internal/SqliteObjectToStringTranslator.cs +++ b/src/EFCore.Sqlite.Core/Query/Internal/SqliteObjectToStringTranslator.cs @@ -66,7 +66,7 @@ public SqliteObjectToStringTranslator(ISqlExpressionFactory sqlExpressionFactory return null; } - if (instance.TypeMapping is not null && instance.TypeMapping.ClrType == typeof(string)) + if (instance.TypeMapping?.ClrType == typeof(string)) { return instance; } diff --git a/test/EFCore.Relational.Specification.Tests/BulkUpdates/NorthwindBulkUpdatesTestBase.cs b/test/EFCore.Relational.Specification.Tests/BulkUpdates/NorthwindBulkUpdatesTestBase.cs index ff708de6c77..f2b4d242396 100644 --- a/test/EFCore.Relational.Specification.Tests/BulkUpdates/NorthwindBulkUpdatesTestBase.cs +++ b/test/EFCore.Relational.Specification.Tests/BulkUpdates/NorthwindBulkUpdatesTestBase.cs @@ -1075,6 +1075,19 @@ public virtual Task Update_Where_Join_set_property_from_joined_single_result_sca } })); + [ConditionalTheory] + [MemberData(nameof(IsAsyncData))] + public virtual Task Update_with_two_inner_joins(bool async) + => AssertUpdate( + async, + ss => ss + .Set() + .Where(od => od.Product.Discontinued && od.Order.OrderDate > new DateTime(1990, 1, 1)), + e => e, + s => s.SetProperty(od => od.Quantity, 1), + rowsAffectedCount: 228, + (b, a) => Assert.All(a, od => Assert.Equal(1, od.Quantity))); + protected string NormalizeDelimitersInRawString(string sql) => Fixture.TestStore.NormalizeDelimitersInRawString(sql); diff --git a/test/EFCore.SqlServer.FunctionalTests/BulkUpdates/NorthwindBulkUpdatesSqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/BulkUpdates/NorthwindBulkUpdatesSqlServerTest.cs index 73abebcf3f8..f1013f9f577 100644 --- a/test/EFCore.SqlServer.FunctionalTests/BulkUpdates/NorthwindBulkUpdatesSqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/BulkUpdates/NorthwindBulkUpdatesSqlServerTest.cs @@ -1,6 +1,8 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using Microsoft.EntityFrameworkCore.TestModels.Northwind; + namespace Microsoft.EntityFrameworkCore.BulkUpdates; public class NorthwindBulkUpdatesSqlServerTest : NorthwindBulkUpdatesTestBase> @@ -1458,6 +1460,23 @@ WHERE [c].[CustomerID] LIKE N'F%' """); } + [ConditionalTheory] + [MemberData(nameof(IsAsyncData))] + public override async Task Update_with_two_inner_joins(bool async) + { + await base.Update_with_two_inner_joins(async); + + AssertExecuteUpdateSql( +""" +UPDATE [o] +SET [o].[Quantity] = CAST(1 AS smallint) +FROM [Order Details] AS [o] +INNER JOIN [Products] AS [p] ON [o].[ProductID] = [p].[ProductID] +INNER JOIN [Orders] AS [o0] ON [o].[OrderID] = [o0].[OrderID] +WHERE [p].[Discontinued] = CAST(1 AS bit) AND [o0].[OrderDate] > '1990-01-01T00:00:00.000' +"""); + } + private void AssertSql(params string[] expected) => Fixture.TestSqlLoggerFactory.AssertBaseline(expected); diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/GearsOfWarQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/GearsOfWarQuerySqlServerTest.cs index 3d1bb510959..f520f973e7d 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/GearsOfWarQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/GearsOfWarQuerySqlServerTest.cs @@ -4099,8 +4099,11 @@ public override async Task ToString_string_property_projection(bool async) { await base.ToString_string_property_projection(async); - AssertSql(@"SELECT [w].[Name] -FROM [Weapons] AS [w]"); + AssertSql( +""" +SELECT [w].[Name] +FROM [Weapons] AS [w] +"""); } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/TPCGearsOfWarQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/TPCGearsOfWarQuerySqlServerTest.cs index 12020fe5257..a809b6c2ab1 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/TPCGearsOfWarQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/TPCGearsOfWarQuerySqlServerTest.cs @@ -12499,8 +12499,11 @@ public override async Task ToString_string_property_projection(bool async) { await base.ToString_string_property_projection(async); - AssertSql(@"SELECT [w].[Name] -FROM [Weapons] AS [w]"); + AssertSql( +""" +SELECT [w].[Name] +FROM [Weapons] AS [w] +"""); } public override async Task ToString_boolean_property_non_nullable(bool async) diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/TPTGearsOfWarQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/TPTGearsOfWarQuerySqlServerTest.cs index 4322839499a..f707ac2f47a 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/TPTGearsOfWarQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/TPTGearsOfWarQuerySqlServerTest.cs @@ -10738,8 +10738,11 @@ public override async Task ToString_string_property_projection(bool async) { await base.ToString_string_property_projection(async); - AssertSql(@"SELECT [w].[Name] -FROM [Weapons] AS [w]"); + AssertSql( +""" +SELECT [w].[Name] +FROM [Weapons] AS [w] +"""); } public override async Task ToString_boolean_property_non_nullable(bool async) diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/TemporalGearsOfWarQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/TemporalGearsOfWarQuerySqlServerTest.cs index f6eb7d67917..4f621c11894 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/TemporalGearsOfWarQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/TemporalGearsOfWarQuerySqlServerTest.cs @@ -9008,8 +9008,11 @@ public override async Task ToString_string_property_projection(bool async) { await base.ToString_string_property_projection(async); - AssertSql(@"SELECT [w].[Name] -FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w]"); + AssertSql( +""" +SELECT [w].[Name] +FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] +"""); } public override async Task ToString_boolean_property_non_nullable(bool async) diff --git a/test/EFCore.Sqlite.FunctionalTests/BulkUpdates/NorthwindBulkUpdatesSqliteTest.cs b/test/EFCore.Sqlite.FunctionalTests/BulkUpdates/NorthwindBulkUpdatesSqliteTest.cs index 3225a0251c2..da91ed756f4 100644 --- a/test/EFCore.Sqlite.FunctionalTests/BulkUpdates/NorthwindBulkUpdatesSqliteTest.cs +++ b/test/EFCore.Sqlite.FunctionalTests/BulkUpdates/NorthwindBulkUpdatesSqliteTest.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using Microsoft.EntityFrameworkCore.Sqlite.Internal; +using Microsoft.EntityFrameworkCore.TestModels.Northwind; namespace Microsoft.EntityFrameworkCore.BulkUpdates; @@ -1365,6 +1366,17 @@ public override async Task Update_Where_Join_set_property_from_joined_single_res ORDER BY "o"."OrderDate" DESC LIMIT 1)) AS INTEGER) AS TEXT) WHERE "c"."CustomerID" LIKE 'F%' +"""); + } + + [ConditionalTheory(Skip = "Issue#28886")] + public override async Task Update_with_two_inner_joins(bool async) + { + await base.Update_with_two_inner_joins(async); + + AssertExecuteUpdateSql( +""" + """); } diff --git a/test/EFCore.Sqlite.FunctionalTests/Query/GearsOfWarQuerySqliteTest.cs b/test/EFCore.Sqlite.FunctionalTests/Query/GearsOfWarQuerySqliteTest.cs index 6f3832eb387..6db8f079775 100644 --- a/test/EFCore.Sqlite.FunctionalTests/Query/GearsOfWarQuerySqliteTest.cs +++ b/test/EFCore.Sqlite.FunctionalTests/Query/GearsOfWarQuerySqliteTest.cs @@ -3095,8 +3095,11 @@ public override async Task ToString_string_property_projection(bool async) { await base.ToString_string_property_projection(async); - AssertSql(@"SELECT ""w"".""Name"" -FROM ""Weapons"" AS ""w"""); + AssertSql( +""" +SELECT "w"."Name" +FROM "Weapons" AS "w" +"""); } public override async Task ToString_boolean_property_non_nullable(bool async)