mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-07-30 04:32:05 +08:00
Synchronization code
This commit is contained in:
parent
91c757bbdf
commit
e8486ee2a4
@ -36,6 +36,7 @@ namespace SqlSugar
|
|||||||
public bool IsWhereColumns { get; set; }
|
public bool IsWhereColumns { get; set; }
|
||||||
public bool? IsListUpdate { get; set; }
|
public bool? IsListUpdate { get; set; }
|
||||||
public List<string> UpdateColumns { get; set; }
|
public List<string> UpdateColumns { get; set; }
|
||||||
|
public List<string> IgnoreColumns { get; set; }
|
||||||
public List<JoinQueryInfo> JoinInfos { get; set; }
|
public List<JoinQueryInfo> JoinInfos { get; set; }
|
||||||
public string ShortName { get; set; }
|
public string ShortName { get; set; }
|
||||||
public Dictionary<string, ReSetValueBySqlExpListModel> ReSetValueBySqlExpList { get; set; }
|
public Dictionary<string, ReSetValueBySqlExpListModel> ReSetValueBySqlExpList { get; set; }
|
||||||
|
@ -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<T> where T : class, new()
|
||||||
|
{
|
||||||
|
internal UpdateableProvider<T> 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<SugarParameter> allParamter = new List<SugarParameter>();
|
||||||
|
var sql=GetSql(item);
|
||||||
|
result+=Context.Ado.ExecuteCommand(sql.Key, sql.Value);
|
||||||
|
});
|
||||||
|
return result<0?count:result;
|
||||||
|
}
|
||||||
|
public async Task<int> 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<SugarParameter> allParamter = new List<SugarParameter>();
|
||||||
|
var sql = GetSql(item);
|
||||||
|
result +=await Context.Ado.ExecuteCommandAsync(sql.Key, sql.Value);
|
||||||
|
});
|
||||||
|
return result < 0 ? count : result;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Values Helper
|
||||||
|
|
||||||
|
public KeyValuePair<string, SugarParameter[]> GetSql(List<T> updateObjects)
|
||||||
|
{
|
||||||
|
var inserable = Updateable as UpdateableProvider<T>;
|
||||||
|
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<SugarParameter> parameters = new List<SugarParameter>();
|
||||||
|
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<string, SugarParameter[]>(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<SugarParameter> 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
|
||||||
|
}
|
||||||
|
}
|
@ -350,7 +350,8 @@ namespace SqlSugar
|
|||||||
SqlParameterDbType = column.SqlParameterDbType,
|
SqlParameterDbType = column.SqlParameterDbType,
|
||||||
TableId = i,
|
TableId = i,
|
||||||
UpdateSql = column.UpdateSql,
|
UpdateSql = column.UpdateSql,
|
||||||
UpdateServerTime = column.UpdateServerTime
|
UpdateServerTime = column.UpdateServerTime,
|
||||||
|
IsPrimarykey=column.IsPrimarykey
|
||||||
};
|
};
|
||||||
if (columnInfo.PropertyType.IsEnum() && columnInfo.Value != null)
|
if (columnInfo.PropertyType.IsEnum() && columnInfo.Value != null)
|
||||||
{
|
{
|
||||||
|
@ -29,7 +29,7 @@ namespace SqlSugar
|
|||||||
public bool IsSingle { get { return this.UpdateObjs.Length == 1; } }
|
public bool IsSingle { get { return this.UpdateObjs.Length == 1; } }
|
||||||
public List<MappingColumn> MappingColumnList { get; set; }
|
public List<MappingColumn> MappingColumnList { get; set; }
|
||||||
private List<string> IgnoreColumnNameList { get; set; }
|
private List<string> IgnoreColumnNameList { get; set; }
|
||||||
private List<string> WhereColumnList { get; set; }
|
internal List<string> WhereColumnList { get; set; }
|
||||||
private bool IsWhereColumns { get; set; }
|
private bool IsWhereColumns { get; set; }
|
||||||
private bool IsOffIdentity { get; set; }
|
private bool IsOffIdentity { get; set; }
|
||||||
private bool IsVersionValidation { 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();
|
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.PropertyName.ToLower())).ToList();
|
||||||
this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => !ignoreColumns.Contains(it.DbColumnName.ToLower())).ToList();
|
this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => !ignoreColumns.Contains(it.DbColumnName.ToLower())).ToList();
|
||||||
|
this.UpdateBuilder.IgnoreColumns = ignoreColumns;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
public IUpdateable<T> IgnoreColumnsIF(bool IsIgnore, Expression<Func<T, object>> columns)
|
public IUpdateable<T> IgnoreColumnsIF(bool IsIgnore, Expression<Func<T, object>> columns)
|
||||||
@ -403,6 +404,7 @@ namespace SqlSugar
|
|||||||
if (columns.HasValue())
|
if (columns.HasValue())
|
||||||
{
|
{
|
||||||
var ignoreColumns = columns.Select(it => it.ToLower()).ToList();
|
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.PropertyName.ToLower())).ToList();
|
||||||
this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => !ignoreColumns.Contains(it.DbColumnName.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);
|
result.Where(sql.Key, sql.Value);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
public ParameterUpdateable<T> UseParameter()
|
||||||
|
{
|
||||||
|
ThrowUpdateByExpressionByMesage(ErrorMessage.GetThrowMessage("UseParameter can only be updated through entity objects", "UseParameter只能通过实体对象更新,不能是表达式方式更新"));
|
||||||
|
ParameterUpdateable<T> parameter = new ParameterUpdateable<T>();
|
||||||
|
parameter.Context = this.Context;
|
||||||
|
parameter.Updateable =(UpdateableProvider<T>)this;
|
||||||
|
return parameter;
|
||||||
|
}
|
||||||
public IUpdateable<T> In(object[] ids)
|
public IUpdateable<T> In(object[] ids)
|
||||||
{
|
{
|
||||||
ThrowUpdateByObjectByMesage(" In(object[] ids) ");
|
ThrowUpdateByObjectByMesage(" In(object[] ids) ");
|
||||||
|
@ -121,6 +121,7 @@ namespace SqlSugar
|
|||||||
IUpdateable<T, T2> InnerJoin<T2>(Expression<Func<T, T2, bool>> joinExpress,string tableName);
|
IUpdateable<T, T2> InnerJoin<T2>(Expression<Func<T, T2, bool>> joinExpress,string tableName);
|
||||||
UpdateablePage<T> PageSize(int pageSize);
|
UpdateablePage<T> PageSize(int pageSize);
|
||||||
IUpdateable<T> In(object[] ids);
|
IUpdateable<T> In(object[] ids);
|
||||||
|
ParameterUpdateable<T> UseParameter();
|
||||||
}
|
}
|
||||||
public interface IUpdateable<T, T2>
|
public interface IUpdateable<T, T2>
|
||||||
{
|
{
|
||||||
|
@ -154,6 +154,7 @@
|
|||||||
<Compile Include="Abstract\SqlBuilderProvider\SqlBuilderProvider_Condition.cs" />
|
<Compile Include="Abstract\SqlBuilderProvider\SqlBuilderProvider_Condition.cs" />
|
||||||
<Compile Include="Abstract\SugarProvider\SqlSugarCoreProvider.cs" />
|
<Compile Include="Abstract\SugarProvider\SqlSugarCoreProvider.cs" />
|
||||||
<Compile Include="Abstract\DeleteProvider\DeleteMethodInfo.cs" />
|
<Compile Include="Abstract\DeleteProvider\DeleteMethodInfo.cs" />
|
||||||
|
<Compile Include="Abstract\UpdateProvider\ParameterUpdateable.cs" />
|
||||||
<Compile Include="Abstract\UpdateProvider\UpdateableFilter.cs" />
|
<Compile Include="Abstract\UpdateProvider\UpdateableFilter.cs" />
|
||||||
<Compile Include="Abstract\UpdateProvider\UpdateablePage.cs" />
|
<Compile Include="Abstract\UpdateProvider\UpdateablePage.cs" />
|
||||||
<Compile Include="Abstract\UpdateProvider\UpdateableProviderT2.cs" />
|
<Compile Include="Abstract\UpdateProvider\UpdateableProviderT2.cs" />
|
||||||
|
Loading…
Reference in New Issue
Block a user