From f287bbe568d139dd5b0782112f5f46b10eb4e5b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=AC=20=E6=98=8E?= Date: Wed, 27 Mar 2024 15:12:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DExecuteMySqlBulkCopyAsync?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E4=BC=9A=E5=87=BA=E7=8E=B0=E7=A9=BA=E5=BC=95?= =?UTF-8?q?=E7=94=A8=E7=9A=84=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 9 ++++++ .../Curd/MySqlInsertOrUpdateTest.cs | 28 ++++++++++++++++++- .../Internal/CommonProvider/UpdateProvider.cs | 1 + .../FreeSqlMySqlConnectorGlobalExtensions.cs | 4 +-- 4 files changed, 39 insertions(+), 3 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 6c9bef48..197e6480 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -826,5 +826,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlInsertOrUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlInsertOrUpdateTest.cs index 91b56e34..bc96af52 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlInsertOrUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlInsertOrUpdateTest.cs @@ -1,7 +1,8 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Xunit; namespace FreeSql.Tests.MySqlConnector @@ -11,6 +12,31 @@ namespace FreeSql.Tests.MySqlConnector IFreeSql fsql => g.mysql; + [Fact] + public void InsertOrUpdate_ExecuteMySqlBulkCopy_Test() + { + fsql.Delete().Where("1=1").ExecuteAffrows(); + var iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou02 { id = 1, name = "01" }, new tbiou02 { id = 2, name = "02" }, new tbiou02 { id = 3, name = "03" }, new tbiou02 { id = 4, name = "04" } }); + var sql = iou.ToSql(); + Assert.Equal(@"INSERT INTO `tbiou02`(`id`, `name`) VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004') +ON DUPLICATE KEY UPDATE +`name` = VALUES(`name`)", sql); + Assert.Equal(4, iou.ExecuteMySqlBulkCopy()); + } + + [Fact] + public async Task InsertOrUpdate_ExecuteMySqlBulkCopyAsync_Test() + { + fsql.Delete().Where("1=1").ExecuteAffrows(); + var iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou02 { id = 1, name = "01" }, new tbiou02 { id = 2, name = "02" }, new tbiou02 { id = 3, name = "03" }, new tbiou02 { id = 4, name = "04" } }); + var sql = iou.ToSql(); + Assert.Equal(@"INSERT INTO `tbiou02`(`id`, `name`) VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04') +ON DUPLICATE KEY UPDATE +`name` = VALUES(`name`)", sql); + Assert.Equal(4, await iou.ExecuteMySqlBulkCopyAsync()); + } + + [Fact] public void InsertOrUpdate_OnePrimary() { diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index b9fa801f..f3cb4e04 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -105,6 +105,7 @@ namespace FreeSql.Internal.CommonProvider #else public static Task ExecuteBulkUpdateAsync(UpdateProvider update, NativeTuple state, Func, Task> funcBulkCopy) where T1 : class => ExecuteBulkCommandAsync(update._source, update._tempPrimarys, update._orm, update._connection, update._transaction, update._table, state, funcBulkCopy); + public static Task ExecuteBulkUpsertAsync(InsertOrUpdateProvider upsert, NativeTuple state, Func, Task> funcBulkCopy) where T1 : class => ExecuteBulkCommandAsync(upsert._source, upsert._tempPrimarys, upsert._orm, upsert._connection, upsert._transaction, upsert._table, state, funcBulkCopy); diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSqlMySqlConnectorGlobalExtensions.cs b/Providers/FreeSql.Provider.MySqlConnector/FreeSqlMySqlConnectorGlobalExtensions.cs index a08d4e23..57a4706f 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSqlMySqlConnectorGlobalExtensions.cs +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSqlMySqlConnectorGlobalExtensions.cs @@ -199,10 +199,10 @@ public static class FreeSqlMySqlConnectorGlobalExtensions #else public static Task ExecuteMySqlBulkCopyAsync(this IInsertOrUpdate that, int? bulkCopyTimeout = null, CancellationToken cancellationToken = default) where T : class { - var upsert = that as UpdateProvider; + var upsert = that as InsertOrUpdateProvider; if (upsert._source.Any() != true || upsert._tempPrimarys.Any() == false) return Task.FromResult(0); var state = ExecuteMySqlBulkCopyState(upsert); - return UpdateProvider.ExecuteBulkUpdateAsync(upsert, state, insert => insert.ExecuteMySqlBulkCopyAsync(bulkCopyTimeout, cancellationToken)); + return UpdateProvider.ExecuteBulkUpsertAsync(upsert, state, insert => insert.ExecuteMySqlBulkCopyAsync(bulkCopyTimeout, cancellationToken)); } public static Task ExecuteMySqlBulkCopyAsync(this IUpdate that, int? bulkCopyTimeout = null, CancellationToken cancellationToken = default) where T : class {