mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-04-05 17:37:58 +08:00
Synchronization code
This commit is contained in:
parent
fd4229a83e
commit
2ef4563f07
@ -88,7 +88,15 @@ namespace SqlSugar
|
|||||||
whereFuncs.Add(new KeyValuePair<StorageType, Func<StorageableInfo<T>, bool>, string>(StorageType.Other, conditions, message));
|
whereFuncs.Add(new KeyValuePair<StorageType, Func<StorageableInfo<T>, bool>, string>(StorageType.Other, conditions, message));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
public StorageableSplitProvider<T> SplitTable()
|
||||||
|
{
|
||||||
|
StorageableSplitProvider<T> result = new StorageableSplitProvider<T>();
|
||||||
|
result.Context = this.Context;
|
||||||
|
result.SaveInfo = this;
|
||||||
|
result.List = allDatas.Select(it=>it.Item).ToList();
|
||||||
|
result.EntityInfo = this.Context.EntityMaintenance.GetEntityInfoWithAttr(typeof(T));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
public IStorageable<T> DefaultAddElseUpdate()
|
public IStorageable<T> DefaultAddElseUpdate()
|
||||||
{
|
{
|
||||||
var column = this.Context.EntityMaintenance.GetEntityInfo<T>().Columns.FirstOrDefault(it=>it.IsPrimarykey);
|
var column = this.Context.EntityMaintenance.GetEntityInfo<T>().Columns.FirstOrDefault(it=>it.IsPrimarykey);
|
||||||
|
@ -0,0 +1,121 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace SqlSugar
|
||||||
|
{
|
||||||
|
public class StorageableSplitProvider<T> where T:class,new()
|
||||||
|
{
|
||||||
|
public Storageable<T> SaveInfo { get; internal set; }
|
||||||
|
public SqlSugarProvider Context { get; internal set; }
|
||||||
|
public List<T> List { get; internal set; }
|
||||||
|
public EntityInfo EntityInfo { get; internal set; }
|
||||||
|
public int PageSize = 1000;
|
||||||
|
public int ExecuteCommand()
|
||||||
|
{
|
||||||
|
if (List.Count > PageSize)
|
||||||
|
{
|
||||||
|
var result = 0;
|
||||||
|
this.Context.Utilities.PageEach(List, PageSize, pageItem =>
|
||||||
|
{
|
||||||
|
result+= _ExecuteCommand(pageItem);
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var list = List;
|
||||||
|
return _ExecuteCommand(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public async Task<int> ExecuteCommandAsync()
|
||||||
|
{
|
||||||
|
if (List.Count > PageSize)
|
||||||
|
{
|
||||||
|
var result = 0;
|
||||||
|
this.Context.Utilities.PageEach(List, PageSize, async pageItem =>
|
||||||
|
{
|
||||||
|
result +=await _ExecuteCommandAsync(pageItem);
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var list = List;
|
||||||
|
return await _ExecuteCommandAsync(list);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private async Task<int> _ExecuteCommandAsync(List<T> list)
|
||||||
|
{
|
||||||
|
int resultValue = 0;
|
||||||
|
List<GroupModel> groupModels;
|
||||||
|
int result;
|
||||||
|
GroupDataList(list, out groupModels, out result);
|
||||||
|
foreach (var item in groupModels.GroupBy(it => it.GroupName))
|
||||||
|
{
|
||||||
|
var addList = item.Select(it => it.Item).ToList();
|
||||||
|
resultValue +=await this.Context.Storageable(addList).ExecuteCommandAsync();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
private int _ExecuteCommand(List<T> list)
|
||||||
|
{
|
||||||
|
int resultValue = 0;
|
||||||
|
List<GroupModel> groupModels;
|
||||||
|
int result;
|
||||||
|
GroupDataList(list, out groupModels, out result);
|
||||||
|
foreach (var item in groupModels.GroupBy(it => it.GroupName))
|
||||||
|
{
|
||||||
|
var addList = item.Select(it => it.Item).ToList();
|
||||||
|
resultValue += this.Context.Storageable(addList).As(item.Key).ExecuteCommand();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GroupDataList(List<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 });
|
||||||
|
}
|
||||||
|
var tablenames = groupModels.Select(it => it.GroupName).Distinct().ToList();
|
||||||
|
CreateTable(tablenames);
|
||||||
|
result = 0;
|
||||||
|
}
|
||||||
|
private void CreateTable(List<string> tableNames)
|
||||||
|
{
|
||||||
|
var isLog = this.Context.Ado.IsEnableLogEvent;
|
||||||
|
this.Context.Ado.IsEnableLogEvent = false;
|
||||||
|
foreach (var item in tableNames)
|
||||||
|
{
|
||||||
|
if (!this.Context.DbMaintenance.IsAnyTable(item, false))
|
||||||
|
{
|
||||||
|
if (item != null)
|
||||||
|
{
|
||||||
|
this.Context.MappingTables.Add(EntityInfo.EntityName, item);
|
||||||
|
this.Context.CodeFirst.InitTables<T>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.Context.Ado.IsEnableLogEvent = isLog;
|
||||||
|
this.Context.MappingTables.Add(EntityInfo.EntityName, EntityInfo.DbTableName);
|
||||||
|
}
|
||||||
|
internal class GroupModel
|
||||||
|
{
|
||||||
|
public string GroupName { get; set; }
|
||||||
|
public T Item { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -31,6 +31,7 @@ namespace SqlSugar
|
|||||||
int ExecuteSqlBulkCopy();
|
int ExecuteSqlBulkCopy();
|
||||||
Task<int> ExecuteSqlBulkCopyAsync();
|
Task<int> ExecuteSqlBulkCopyAsync();
|
||||||
IStorageable<T> DefaultAddElseUpdate();
|
IStorageable<T> DefaultAddElseUpdate();
|
||||||
|
StorageableSplitProvider<T> SplitTable();
|
||||||
}
|
}
|
||||||
|
|
||||||
public class StorageableInfo<T> where T : class, new()
|
public class StorageableInfo<T> where T : class, new()
|
||||||
|
Loading…
Reference in New Issue
Block a user