From 5a6e22c8f19d5a45135d2e75334c3b964eebe1d8 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sun, 12 Mar 2023 12:00:01 +0800 Subject: [PATCH] Trace insert supports batch operation --- .../UpdateProvider/UpdateableHelper.cs | 68 ++++++++++++++++++- .../UpdateProvider/UpdateableProvider.cs | 5 ++ 2 files changed, 71 insertions(+), 2 deletions(-) diff --git a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableHelper.cs b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableHelper.cs index c090d0ce9..0f22301a9 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableHelper.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableHelper.cs @@ -11,14 +11,71 @@ namespace SqlSugar { public partial class UpdateableProvider : IUpdateable where T : class, new() { - + private int DatasTrackingExecommand() + { + var trakRows = 0; + try + { + if (this.Context.Ado.IsNoTran()) + { + this.Context.Ado.BeginTran(); + } + int i = 0; + foreach (var item in this.UpdateObjs) + { + var newUpdateable = this.Clone(); + (newUpdateable as UpdateableProvider).UpdateObjs = new[] { item }; + newUpdateable.UpdateBuilder.IsListUpdate = null; + newUpdateable.UpdateBuilder.DbColumnInfoList = + newUpdateable.UpdateBuilder.DbColumnInfoList.Where(it => it.TableId == i).ToList(); + AppendTracking(item, newUpdateable); + if (newUpdateable.UpdateBuilder.DbColumnInfoList?.Any() == true) + { + trakRows += newUpdateable.ExecuteCommand(); + } + ++i; + } + if (this.Context.Ado.IsNoTran()) + { + this.Context.Ado.CommitTran(); + } + } + catch (Exception) + { + if (this.Context.Ado.IsNoTran()) + { + this.Context.Ado.RollbackTran(); + } + throw; + } + return trakRows; + } private bool UpdateObjectNotWhere() { return this.Context.CurrentConnectionConfig.DbType != DbType.MySql && this.Context.CurrentConnectionConfig.DbType != DbType.MySqlConnector && this.Context.CurrentConnectionConfig.DbType != DbType.SqlServer; } - + private void AppendTracking(T item, IUpdateable newUpdateable) + { + var trackingData = this.Context.TempItems.FirstOrDefault(it => it.Key.StartsWith("Tracking_" + item.GetHashCode())); + var diffColumns = FastCopy.GetDiff(item, (T)trackingData.Value); + if (diffColumns.Count > 0) + { + var pks = EntityInfo.Columns + .Where(it => it.IsPrimarykey).Select(it => it.PropertyName).ToList(); + diffColumns = diffColumns.Where(it => !pks.Contains(it)).ToList(); + if (diffColumns.Count > 0) + { + newUpdateable.UpdateColumns(diffColumns.ToArray()); + } + } + else + { + (newUpdateable as UpdateableProvider).UpdateObjs = new T[] { null }; + newUpdateable.UpdateBuilder.DbColumnInfoList = new List(); + } + } private void AppendSets() { if (SetColumnsIndex > 0) @@ -139,6 +196,13 @@ namespace SqlSugar && this.UpdateObjs.Length == 1; } + private bool IsTrakingDatas() + { + return this.UpdateParameterIsNull == false + && this.Context.TempItems != null + && this.Context.TempItems.Any(it => it.Key.StartsWith("Tracking_")) + && this.UpdateObjs.Length > 1; + } private void DataAop(T item) { var dataEvent = this.Context.CurrentConnectionConfig.AopEvents?.DataExecuting; diff --git a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs index 6583b8c73..b1a140278 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs @@ -80,6 +80,11 @@ namespace SqlSugar public virtual int ExecuteCommand() { + if (this.IsTrakingDatas()) + { + int trakRows = DatasTrackingExecommand(); + return trakRows; + } string sql = _ExecuteCommand(); if (string.IsNullOrEmpty(sql)) {