diff --git a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs index c73a007cd..180a5da49 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs @@ -36,6 +36,7 @@ namespace SqlSugar public bool IsWhereColumns { get; set; } public bool? IsListUpdate { get; set; } public List UpdateColumns { get; set; } + public List IgnoreColumns { get; set; } public List JoinInfos { get; set; } public string ShortName { get; set; } public Dictionary ReSetValueBySqlExpList { get; set; } diff --git a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/ParameterUpdateable.cs b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/ParameterUpdateable.cs new file mode 100644 index 000000000..c4cc7d823 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/ParameterUpdateable.cs @@ -0,0 +1,125 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public class ParameterUpdateable where T : class, new() + { + internal UpdateableProvider Updateable { get; set; } + internal SqlSugarProvider Context { get; set; } + public int ExecuteCommand() + { + var result = 0; + var list = Updateable.UpdateObjs; + var count = list.Length; + var size = GetPageSize(20, count); + Context.Utilities.PageEach(list.ToList(), size, item => + { + List allParamter = new List(); + var sql=GetSql(item); + result+=Context.Ado.ExecuteCommand(sql.Key, sql.Value); + }); + return result<0?count:result; + } + public async Task ExecuteCommandAsync() + { + var result = 0; + var list = Updateable.UpdateObjs; + var count = list.Length; + var size = GetPageSize(20, count); + await Context.Utilities.PageEachAsync(list.ToList(), size,async item => + { + List allParamter = new List(); + var sql = GetSql(item); + result +=await Context.Ado.ExecuteCommandAsync(sql.Key, sql.Value); + }); + return result < 0 ? count : result; + } + + #region Values Helper + + public KeyValuePair GetSql(List updateObjects) + { + var inserable = Updateable as UpdateableProvider; + var builder = inserable.UpdateBuilder.Builder; + var columns = inserable.UpdateBuilder.DbColumnInfoList.GroupBy(it => it.DbColumnName).Select(it => it.Key).Distinct().ToList(); + var tableWithString = builder.GetTranslationColumnName(inserable.UpdateBuilder.TableName); + var wheres = inserable.WhereColumnList ?? inserable.UpdateBuilder.PrimaryKeys; + if (wheres == null) + { + wheres = inserable.UpdateBuilder.DbColumnInfoList + .Where(it => it.IsPrimarykey).Select(it => it.DbColumnName).Distinct().ToList(); + } + StringBuilder sbAllSql = new StringBuilder(); + var sqlTemp = ($" UPDATE {tableWithString} SET {{0}} WHERE {{1}};\r\n"); + List parameters = new List(); + Check.ExceptionEasy(wheres?.Any() != true, "Updates cannot be without a primary key or condition", "更新不能没有主键或者条件"); + foreach (var item in this.Context.Updateable(updateObjects).UpdateBuilder.DbColumnInfoList.GroupBy(it => it.TableId)) + { + Check.ExceptionEasy(item?.ToList()?.Any() != true, "Set has no columns", "更新Set没有列"); + StringBuilder setString = new StringBuilder(); + foreach (var setItem in item.ToList()) + { + if (setItem.IsPrimarykey) { continue; } + if (Updateable.UpdateBuilder.UpdateColumns?.Any() == true) + { + if (!Updateable.UpdateBuilder.UpdateColumns.Any(it => it.EqualCase(setItem.DbColumnName))) + { + continue; + } + } + if (Updateable.UpdateBuilder.IgnoreColumns?.Any() == true) + { + if (Updateable.UpdateBuilder.IgnoreColumns.Any(it => it.EqualCase(setItem.DbColumnName))) + { + continue; + } + } + var paraterName = FormatValue(setItem.PropertyType, setItem.DbColumnName, setItem.Value, parameters); + setString.Append($" {builder.GetTranslationColumnName(setItem.DbColumnName)} = {paraterName} ,"); + } + StringBuilder whereString = new StringBuilder(); + foreach (var whereItem in wheres) + { + var pk = item.FirstOrDefault(it => it.DbColumnName.EqualCase(whereItem)); + var paraterName = FormatValue(pk.PropertyType, pk.DbColumnName, pk.Value, parameters); + whereString.Append($" {pk.DbColumnName} = {paraterName} ,"); + } + var builderItem = string.Format(sqlTemp, setString.ToString().TrimEnd(','), whereString.ToString().TrimEnd(',')); + sbAllSql.Append(builderItem); + } + builder.FormatSaveQueueSql(sbAllSql); + return new KeyValuePair(sbAllSql.ToString(), parameters.ToArray()); + } + + private int GetPageSize(int pageSize, int count) + { + if (pageSize * count > 2100) + { + pageSize = 50; + } + if (pageSize * count > 2100) + { + pageSize = 20; + } + if (pageSize * count > 2100) + { + pageSize = 10; + } + + return pageSize; + } + private string FormatValue(Type type, string name, object value, List allParamter) + { + var keyword=this.Updateable.UpdateBuilder.Builder.SqlParameterKeyWord; + var result = keyword + name + allParamter.Count; + var addParameter = new SugarParameter(result, value, type); + allParamter.Add(addParameter); + return result; + } + #endregion + } +} diff --git a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableHelper.cs b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableHelper.cs index 7a35d7660..0b3d0c9d1 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableHelper.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableHelper.cs @@ -350,7 +350,8 @@ namespace SqlSugar SqlParameterDbType = column.SqlParameterDbType, TableId = i, UpdateSql = column.UpdateSql, - UpdateServerTime = column.UpdateServerTime + UpdateServerTime = column.UpdateServerTime, + IsPrimarykey=column.IsPrimarykey }; if (columnInfo.PropertyType.IsEnum() && columnInfo.Value != null) { diff --git a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs index 6b7aa0eb1..f9532f757 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs @@ -29,7 +29,7 @@ namespace SqlSugar public bool IsSingle { get { return this.UpdateObjs.Length == 1; } } public List MappingColumnList { get; set; } private List IgnoreColumnNameList { get; set; } - private List WhereColumnList { get; set; } + internal List WhereColumnList { get; set; } private bool IsWhereColumns { get; set; } private bool IsOffIdentity { get; set; } private bool IsVersionValidation { get; set; } @@ -380,6 +380,7 @@ namespace SqlSugar var ignoreColumns = UpdateBuilder.GetExpressionValue(columns, ResolveExpressType.ArraySingle).GetResultArray().Select(it => this.SqlBuilder.GetNoTranslationColumnName(it).ToLower()).ToList(); this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => !ignoreColumns.Contains(it.PropertyName.ToLower())).ToList(); this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => !ignoreColumns.Contains(it.DbColumnName.ToLower())).ToList(); + this.UpdateBuilder.IgnoreColumns = ignoreColumns; return this; } public IUpdateable IgnoreColumnsIF(bool IsIgnore, Expression> columns) @@ -403,6 +404,7 @@ namespace SqlSugar if (columns.HasValue()) { var ignoreColumns = columns.Select(it => it.ToLower()).ToList(); + this.UpdateBuilder.IgnoreColumns = ignoreColumns; this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => !ignoreColumns.Contains(it.PropertyName.ToLower())).ToList(); this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => !ignoreColumns.Contains(it.DbColumnName.ToLower())).ToList(); } @@ -965,7 +967,14 @@ namespace SqlSugar result.Where(sql.Key, sql.Value); return result; } - + public ParameterUpdateable UseParameter() + { + ThrowUpdateByExpressionByMesage(ErrorMessage.GetThrowMessage("UseParameter can only be updated through entity objects", "UseParameter只能通过实体对象更新,不能是表达式方式更新")); + ParameterUpdateable parameter = new ParameterUpdateable(); + parameter.Context = this.Context; + parameter.Updateable =(UpdateableProvider)this; + return parameter; + } public IUpdateable In(object[] ids) { ThrowUpdateByObjectByMesage(" In(object[] ids) "); diff --git a/Src/Asp.Net/SqlSugar/Interface/IUpdateable.cs b/Src/Asp.Net/SqlSugar/Interface/IUpdateable.cs index 690c0351a..251613c54 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IUpdateable.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IUpdateable.cs @@ -121,6 +121,7 @@ namespace SqlSugar IUpdateable InnerJoin(Expression> joinExpress,string tableName); UpdateablePage PageSize(int pageSize); IUpdateable In(object[] ids); + ParameterUpdateable UseParameter(); } public interface IUpdateable { diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index 95ba24cc7..71f08be94 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -154,6 +154,7 @@ +