using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace SqlSugar { public class SplitTableUpdateByObjectProvider where T : class, new() { public SqlSugarProvider Context; public UpdateableProvider updateobj; public T[] UpdateObjects { get; set; } public IEnumerable Tables { get; set; } public int ExecuteCommand() { List groupModels; int result; GroupDataList(UpdateObjects, out groupModels, out result); foreach (var item in groupModels.GroupBy(it => it.GroupName)) { var addList = item.Select(it => it.Item).ToList(); result += this.Context.Updateable(addList) .IgnoreColumns(this.updateobj.UpdateBuilder.IsNoUpdateNull, this.updateobj.UpdateBuilder.IsOffIdentity,this.updateobj.UpdateBuilder.IsNoUpdateDefaultValue) .IgnoreColumns(GetIgnoreColumns()).AS(item.Key).ExecuteCommand(); } return result; } public async Task ExecuteCommandAsync() { List groupModels; int result; GroupDataList(UpdateObjects, out groupModels, out result); foreach (var item in groupModels.GroupBy(it => it.GroupName)) { var addList = item.Select(it => it.Item).ToList(); result += await this.Context.Updateable(addList) .IgnoreColumns(this.updateobj.UpdateBuilder.IsNoUpdateNull, this.updateobj.UpdateBuilder.IsOffIdentity, this.updateobj.UpdateBuilder.IsNoUpdateDefaultValue) .IgnoreColumns(GetIgnoreColumns()).AS(item.Key).ExecuteCommandAsync(); } return result; } private string [] GetIgnoreColumns() { if (this.updateobj.UpdateBuilder.DbColumnInfoList.Any()) { var columns=this.updateobj.UpdateBuilder.DbColumnInfoList.Select(it => it.DbColumnName).Distinct().ToList(); var result= this.Context.EntityMaintenance.GetEntityInfo().Columns.Where(x => !columns.Any(y => y.EqualCase(x.DbColumnName))).Select(it => it.DbColumnName).ToArray(); result = result.Where(it => !string.IsNullOrEmpty(it)).ToArray(); return result; } else { return null; } } private void GroupDataList(T[] datas, out List groupModels, out int result) { var attribute = typeof(T).GetCustomAttribute() as SplitTableAttribute; Check.Exception(attribute == null, $"{typeof(T).Name} need SplitTableAttribute"); groupModels = new List(); var db = this.Context; foreach (var item in datas) { var value = db.SplitHelper().GetValue(attribute.SplitType, item); var tableName = db.SplitHelper().GetTableName(attribute.SplitType, value); groupModels.Add(new GroupModel() { GroupName = tableName, Item = item }); } result = 0; } internal class GroupModel { public string GroupName { get; set; } public T Item { get; set; } } } }