From 45d5528a0e0df770a50438849b935d540c00d9fa Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sun, 10 Sep 2023 00:30:51 +0800 Subject: [PATCH] Synchronization code --- .../UpdateNavProviderHelper.cs | 10 ++ .../SqlBuilderProvider/UpdateBuilder.cs | 1 + .../UpdateProvider/UpdateableFilter.cs | 108 ++++++++++++++++++ .../Abstract/UpdateProvider/UpdateablePage.cs | 14 +++ .../UpdateProvider/UpdateableProvider.cs | 4 + Src/Asp.Net/SqlSugar/SqlSugar.csproj | 1 + 6 files changed, 138 insertions(+) create mode 100644 Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableFilter.cs diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavProviderHelper.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavProviderHelper.cs index 6893cd16c..377ce51bb 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavProviderHelper.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavProviderHelper.cs @@ -86,6 +86,16 @@ namespace SqlSugar com(updateable); updateable.ExecuteCommand(); } + else if (pkColumn.IsPrimarykey == false) + { + var pk= this._Context.EntityMaintenance.GetEntityInfo().Columns.Where(it => it.IsPrimarykey); + List ignoreColumns = new List(); + if (pk.Any()) + { + ignoreColumns.AddRange(pk.Select(it=>it.PropertyName)); + } + x.AsUpdateable.IgnoreColumns(ignoreColumns.ToArray()).ExecuteCommand(); + } else { x.AsUpdateable.ExecuteCommand(); diff --git a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs index 9683a181e..9ef77b8d4 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs @@ -26,6 +26,7 @@ namespace SqlSugar public string TableWithString { get; set; } public List DbColumnInfoList { get; set; } public List WhereValues { get; set; } + public string AppendWhere { get; set; } public List> SetValues { get; set; } public bool IsNoUpdateNull { get; set; } public bool IsNoUpdateDefaultValue { get; set; } diff --git a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableFilter.cs b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableFilter.cs new file mode 100644 index 000000000..1424fc913 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableFilter.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public class UpdateableFilter where T : class, new() + { + public T[] DataList { get; set; } + public SqlSugarProvider Context { get; set; } + public int PageSize { get; internal set; } + public string TableName { get; internal set; } + public bool IsEnableDiffLogEvent { get; internal set; } + public DiffLogModel DiffModel { get; internal set; } + public List UpdateColumns { get; internal set; } + public int ExecuteCommand() + { + if (DataList.Count() == 1 && DataList.First() == null) + { + return 0; + } + PageSize = 1; + var result = 0; + var isNoTran = this.Context.Ado.IsNoTran(); + try + { + if (isNoTran) + { + this.Context.Ado.BeginTran(); + } + this.Context.Utilities.PageEach(DataList, PageSize, pageItem => + { + result += SetFilterSql(this.Context.Updateable(pageItem.First()).AS(TableName).EnableDiffLogEventIF(IsEnableDiffLogEvent, DiffModel).UpdateColumns(UpdateColumns.ToArray())).ExecuteCommand(); + }); + if (isNoTran) + { + this.Context.Ado.CommitTran(); + } + } + catch (Exception) + { + if (isNoTran) + { + this.Context.Ado.RollbackTran(); + } + throw; + } + return result; + } + + + + public async Task ExecuteCommandAsync() + { + if (DataList.Count() == 1 && DataList.First() == null) + { + return 0; + } + PageSize = 1; + var result = 0; + var isNoTran = this.Context.Ado.IsNoTran(); + try + { + if (isNoTran) + { + await this.Context.Ado.BeginTranAsync(); + } + await this.Context.Utilities.PageEachAsync(DataList, PageSize, async pageItem => + { + result += await SetFilterSql(this.Context.Updateable(pageItem.First()).AS(TableName).EnableDiffLogEventIF(IsEnableDiffLogEvent, DiffModel).UpdateColumns(UpdateColumns.ToArray())).ExecuteCommandAsync(); + }); + if (isNoTran) + { + await this.Context.Ado.CommitTranAsync(); + } + } + catch (Exception) + { + if (isNoTran) + { + await this.Context.Ado.RollbackTranAsync(); + } + throw; + } + return result; + } + + + private IUpdateable SetFilterSql(IUpdateable updateable) + { + var queryable = this.Context.Queryable(); + queryable.QueryBuilder.LambdaExpressions.ParameterIndex = 10000; + var sqlobj=queryable.ToSql(); + var sql= UtilMethods.RemoveBeforeFirstWhere(sqlobj.Key); + if (sql!=sqlobj.Key) + { + updateable.UpdateBuilder.AppendWhere = sql; + } + if (sqlobj.Value != null) + { + updateable.UpdateBuilder.Parameters.AddRange(sqlobj.Value); + } + return updateable; + } + } +} diff --git a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateablePage.cs b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateablePage.cs index 52a5da9f3..7127c47b6 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateablePage.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateablePage.cs @@ -15,6 +15,20 @@ namespace SqlSugar public bool IsEnableDiffLogEvent { get; internal set; } public DiffLogModel DiffModel { get; internal set; } public List UpdateColumns { get; internal set; } + + public UpdateableFilter EnableQueryFilter() + { + return new UpdateableFilter() + { + Context= Context, + DataList= DataList, + DiffModel= DiffModel, + IsEnableDiffLogEvent= IsEnableDiffLogEvent, + PageSize=PageSize, + TableName=TableName, + UpdateColumns=UpdateColumns + }; + } public int ExecuteCommand() { if (DataList.Count() == 1 && DataList.First() == null) diff --git a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs index ffb17aa9c..216268ffe 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs @@ -104,6 +104,10 @@ namespace SqlSugar return trakRows; } string sql = _ExecuteCommand(); + if (this.UpdateBuilder.AppendWhere.HasValue()) + { + sql += " AND "+ this.UpdateBuilder.AppendWhere; + } if (string.IsNullOrEmpty(sql)) { return 0; diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index 3d24d6ed8..c35246542 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -150,6 +150,7 @@ +