From 09598877b4ccccfefee991b67836b55f5e0b7ac9 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sun, 10 Sep 2023 00:17:18 +0800 Subject: [PATCH] var result = db.Updateable(updateObj) .PageSize(1).EnableFilter().ExecuteCommand() --- .../SqlBuilderProvider/UpdateBuilder.cs | 1 + .../UpdateProvider/UpdateableFilter.cs | 105 ++++++++++++++++++ .../Abstract/UpdateProvider/UpdateablePage.cs | 14 +++ .../UpdateProvider/UpdateableProvider.cs | 4 + 4 files changed, 124 insertions(+) create mode 100644 Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateableFilter.cs diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs index 9683a181e..9ef77b8d4 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs +++ b/Src/Asp.NetCore2/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.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateableFilter.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateableFilter.cs new file mode 100644 index 000000000..53517f6ea --- /dev/null +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateableFilter.cs @@ -0,0 +1,105 @@ +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); + updateable.UpdateBuilder.AppendWhere = sql; + if (sqlobj.Value != null) + { + updateable.UpdateBuilder.Parameters.AddRange(sqlobj.Value); + } + return updateable; + } + } +} diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateablePage.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateablePage.cs index 52a5da9f3..e99f13771 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateablePage.cs +++ b/Src/Asp.NetCore2/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 EnableFilter() + { + 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.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs index ffb17aa9c..216268ffe 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs +++ b/Src/Asp.NetCore2/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;