private void RunBatchUpdate_UsingNavigationPropertiesThatTranslateToAnInnerQuery() { var testDbCommandInterceptor = new TestDbCommandInterceptor(); using (var context = new TestContext(ContextUtil.GetOptions(testDbCommandInterceptor))) { context.Parents.Where(parent => parent.ParentId < 5 && !string.IsNullOrEmpty(parent.Details.Notes)) .BatchUpdate(parent => new Parent { Description = parent.Details.Notes ?? "Fallback" }); var actualSqlExecuted = testDbCommandInterceptor.ExecutedNonQueryCommands?.LastOrDefault(); var expectedSql = @"UPDATE p SET [p].[Description] = ( SELECT COALESCE([p1].[Notes], N'Fallback') FROM [ParentDetail] AS [p1] WHERE [p1].[ParentId] = [p].[ParentId]) FROM [Parent] AS [p] LEFT JOIN [ParentDetail] AS [p0] ON [p].[ParentId] = [p0].[ParentId] WHERE ([p].[ParentId] < 5) AND ([p0].[Notes] IS NOT NULL AND (([p0].[Notes] <> N'') OR [p0].[Notes] IS NULL))"; Assert.Equal(expectedSql.Replace("\r\n", "\n"), actualSqlExecuted.Replace("\r\n", "\n")); context.Parents.Where(parent => parent.ParentId == 1) .BatchUpdate(parent => new Parent { Value = parent.Children.Where(child => child.IsEnabled).Sum(child => child.Value) }); actualSqlExecuted = testDbCommandInterceptor.ExecutedNonQueryCommands?.LastOrDefault(); expectedSql = @"UPDATE p SET [p].[Value] = ( SELECT SUM([c].[Value]) FROM [Child] AS [c] WHERE ([p].[ParentId] = [c].[ParentId]) AND ([c].[IsEnabled] = CAST(1 AS bit))) FROM [Parent] AS [p] WHERE [p].[ParentId] = 1"; Assert.Equal(expectedSql.Replace("\r\n", "\n"), actualSqlExecuted.Replace("\r\n", "\n")); var newValue = 5; context.Parents.Where(parent => parent.ParentId == 1) .BatchUpdate(parent => new Parent { Description = parent.Children.Where(child => child.IsEnabled && child.Value == newValue).Sum(child => child.Value).ToString(), Value = newValue }); actualSqlExecuted = testDbCommandInterceptor.ExecutedNonQueryCommands?.LastOrDefault(); expectedSql = @"UPDATE p SET [p].[Description] = (CONVERT(VARCHAR(100), ( SELECT SUM([c].[Value]) FROM [Child] AS [c] WHERE ([p].[ParentId] = [c].[ParentId]) AND (([c].[IsEnabled] = CAST(1 AS bit)) AND ([c].[Value] = @__p_0))))) , [p].[Value] = @param_1 FROM [Parent] AS [p] WHERE [p].[ParentId] = 1"; Assert.Equal(expectedSql.Replace("\r\n", "\n"), actualSqlExecuted.Replace("\r\n", "\n")); } }
public async Task BatchUpdateAsync_correctly_specifies_AnsiString_type_on_the_sql_parameter() { var dbCommandInterceptor = new TestDbCommandInterceptor(); var interceptors = new[] { dbCommandInterceptor }; using var testContext = new TestContext(ContextUtil.GetOptions <TestContext>(DbServer.SqlServer, interceptors)); string oldPhoneNumber = "7756789999"; string newPhoneNumber = "3606789999"; _ = await testContext.Parents .Where(parent => parent.PhoneNumber == oldPhoneNumber) .BatchUpdateAsync(parent => new Parent { PhoneNumber = newPhoneNumber }) .ConfigureAwait(false); var executedCommand = dbCommandInterceptor.ExecutedNonQueryCommands.Last(); Assert.Equal(2, executedCommand.DbParameters.Count); var oldPhoneNumberParameter = (Microsoft.Data.SqlClient.SqlParameter)executedCommand.DbParameters.Single(param => param.ParameterName == "@__oldPhoneNumber_0"); Assert.Equal(System.Data.DbType.AnsiString, oldPhoneNumberParameter.DbType); Assert.Equal(System.Data.SqlDbType.VarChar, oldPhoneNumberParameter.SqlDbType); var newPhoneNumberParameter = (Microsoft.Data.SqlClient.SqlParameter)executedCommand.DbParameters.Single(param => param.ParameterName == "@param_1"); Assert.Equal(System.Data.DbType.AnsiString, newPhoneNumberParameter.DbType); Assert.Equal(System.Data.SqlDbType.VarChar, newPhoneNumberParameter.SqlDbType); var expectedSql = @"UPDATE p SET [p].[PhoneNumber] = @param_1 FROM [Parent] AS [p] WHERE [p].[PhoneNumber] = @__oldPhoneNumber_0"; Assert.Equal(expectedSql.Replace("\r\n", "\n"), executedCommand.Sql.Replace("\r\n", "\n")); }