diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/FastestProvider/FastestProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/FastestProvider/FastestProvider.cs index 47474a4dd..b35c089a1 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/FastestProvider/FastestProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/FastestProvider/FastestProvider.cs @@ -170,7 +170,7 @@ namespace SqlSugar public Task BulkMergeAsync(List datas) { var updateColumns = entityInfo.Columns.Where(it => !it.IsPrimarykey && !it.IsIdentity && !it.IsOnlyIgnoreUpdate && !it.IsIgnore).Select(it => it.DbColumnName ?? it.PropertyName).ToArray(); - var whereColumns = entityInfo.Columns.Where(it => it.IsPrimarykey).Select(it => it.DbColumnName ?? it.PropertyName).ToArray(); Begin(datas, false); + var whereColumns = entityInfo.Columns.Where(it => it.IsPrimarykey).Select(it => it.DbColumnName ?? it.PropertyName).ToArray(); ; return BulkMergeAsync(datas, whereColumns, updateColumns); } public int BulkMerge(List datas) @@ -192,7 +192,7 @@ namespace SqlSugar { int resul = 0; await this.context.Utilities.PageEachAsync(datas, Size, async item => - { + { resul += await _BulkMerge(item, updateColumns, whereColumns); }); return resul; @@ -208,7 +208,8 @@ namespace SqlSugar } private async Task _BulkMerge(List datas, string[] updateColumns, string[] whereColumns) - { + { + Begin(datas, false,true); Check.Exception(whereColumns == null || whereColumns.Count() == 0, "where columns count=0 or need primary key"); Check.Exception(whereColumns == null || whereColumns.Count() == 0, "where columns count=0 or need primary key"); var isAuto = this.context.CurrentConnectionConfig.IsAutoCloseConnection; @@ -216,18 +217,21 @@ namespace SqlSugar DataTable dt = ToDdateTable(datas); IFastBuilder buider = GetBuider(); buider.Context = context; - await buider.CreateTempAsync(dt); - await buider.ExecuteBulkCopyAsync(dt); + if (buider?.DbFastestProperties?.IsMerge == true) + { + await buider.CreateTempAsync(dt); + await buider.ExecuteBulkCopyAsync(dt); + } var result = await buider.Merge(dt, this.entityInfo,whereColumns,updateColumns, datas); //var queryTemp = this.context.Queryable().AS(dt.TableName).ToList();//test //var result = await buider.UpdateByTempAsync(GetTableName(), dt.TableName, updateColumns, whereColumns); - if (this.context.CurrentConnectionConfig.DbType != DbType.Sqlite) + if (buider?.DbFastestProperties?.IsMerge == true&&this.context.CurrentConnectionConfig.DbType != DbType.Sqlite) { this.context.DbMaintenance.DropTable(dt.TableName); } this.context.CurrentConnectionConfig.IsAutoCloseConnection = isAuto; buider.CloseDb(); - End(datas, false); + End(datas, false,true); return result; } #endregion @@ -346,9 +350,13 @@ namespace SqlSugar #endregion #region AOP - private void End(List datas,bool isAdd) + private void End(List datas,bool isAdd,bool isMerge=false) { var title = isAdd ? "BulkCopy" : "BulkUpdate"; + if (isMerge) + { + title = "BulkMerge"; + } this.context.Ado.IsEnableLogEvent = isLog; if (this.context.CurrentConnectionConfig?.AopEvents?.OnLogExecuted != null) { @@ -356,9 +364,13 @@ namespace SqlSugar } RemoveCache(); } - private void Begin(List datas,bool isAdd) + private void Begin(List datas,bool isAdd, bool isMerge = false) { var title = isAdd ? "BulkCopy" : "BulkUpdate"; + if (isMerge) + { + title = "BulkMerge"; + } isLog = this.context.Ado.IsEnableLogEvent; this.context.Ado.IsEnableLogEvent = false; if (this.context.CurrentConnectionConfig?.AopEvents?.OnLogExecuting != null) diff --git a/Src/Asp.NetCore2/SqlSugar/Entities/DbFastestProperties.cs b/Src/Asp.NetCore2/SqlSugar/Entities/DbFastestProperties.cs index a84fd1c79..7bc3b3789 100644 --- a/Src/Asp.NetCore2/SqlSugar/Entities/DbFastestProperties.cs +++ b/Src/Asp.NetCore2/SqlSugar/Entities/DbFastestProperties.cs @@ -11,5 +11,6 @@ namespace SqlSugar public bool HasOffsetTime { get; set; } public string[] WhereColumns { get; set; } public bool IsOffIdentity { get; set; } + public bool IsMerge { get; set; } } } diff --git a/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleFastBuilder.cs b/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleFastBuilder.cs index a1ca15684..bdfa72042 100644 --- a/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleFastBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleFastBuilder.cs @@ -9,6 +9,10 @@ namespace SqlSugar { public class OracleFastBuilder : FastBuilder, IFastBuilder { + public override DbFastestProperties DbFastestProperties { get; set; } = new DbFastestProperties() + { + IsMerge = true + }; private EntityInfo entityInfo; public OracleFastBuilder(EntityInfo entityInfo) diff --git a/Src/Asp.NetCore2/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerFastBuilder.cs b/Src/Asp.NetCore2/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerFastBuilder.cs index 7d4d50398..643acee0f 100644 --- a/Src/Asp.NetCore2/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerFastBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerFastBuilder.cs @@ -14,7 +14,8 @@ namespace SqlSugar { public override bool IsActionUpdateColumns { get; set; } = true; public override DbFastestProperties DbFastestProperties { get; set; } = new DbFastestProperties() { - HasOffsetTime=true + HasOffsetTime=true, + IsMerge=true }; public async Task ExecuteBulkCopyAsync(DataTable dt) {