sqlsugar/Src/OracleUS7ASCII/SqlSugar/Abstract/UpdateProvider/SplitTableUpdateByObjectPro...

84 lines
3.4 KiB
C#
Raw Permalink Normal View History

2025-05-11 16:20:50 +08:00
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<T> where T : class, new()
{
public SqlSugarProvider Context;
public UpdateableProvider<T> updateobj;
public T[] UpdateObjects { get; set; }
public IEnumerable<SplitTableInfo> Tables { get; set; }
public int ExecuteCommand()
{
List<GroupModel> 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<int> ExecuteCommandAsync()
{
List<GroupModel> 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<T>().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<GroupModel> groupModels, out int result)
{
var attribute = typeof(T).GetCustomAttribute<SplitTableAttribute>() as SplitTableAttribute;
Check.Exception(attribute == null, $"{typeof(T).Name} need SplitTableAttribute");
groupModels = new List<GroupModel>();
var db = this.Context;
foreach (var item in datas)
{
var value = db.SplitHelper<T>().GetValue(attribute.SplitType, item);
var tableName = db.SplitHelper<T>().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; }
}
}
}