Add BulkMerge (userInfo, new string[] { "UserId" }, new string[] { "UserName" }, true)

This commit is contained in:
sunkaixuan
2025-04-11 09:22:36 +08:00
parent 4851043e71
commit 9daae7160e
2 changed files with 48 additions and 0 deletions

View File

@@ -198,6 +198,18 @@ namespace SqlSugar
var result = (Task<int>)bulkCopyMethod.Invoke(fastestMethod, new object[] { newValue });
return result;
}
public int BulkMerge(DataTable dataTable, string[] whereColumns, string[] updateColumns, bool isIdentity)
{
return BulkMergeAsync(dataTable, whereColumns, updateColumns, isIdentity).GetAwaiter().GetResult();
}
public Task<int> BulkMergeAsync(DataTable dataTable, string[] whereColumns, string[] updateColumns, bool isIdentity)
{
object newValue, fastestMethod;
MethodInfo bulkCopyMethod;
_BulkMerge(dataTable, whereColumns,updateColumns, out newValue, out fastestMethod, out bulkCopyMethod, true, isIdentity);
var result = (Task<int>)bulkCopyMethod.Invoke(fastestMethod, new object[] { newValue,whereColumns,updateColumns });
return result;
}
public Task<int> BulkMergeAsync(List<T> datas, string[] whereColumns)
{
var updateColumns = entityInfo.Columns.Where(it => !it.IsPrimarykey && !it.IsIdentity && !it.IsOnlyIgnoreUpdate && !it.IsIgnore).Select(it => it.DbColumnName ?? it.PropertyName).ToArray();
@@ -303,6 +315,40 @@ namespace SqlSugar
.Invoke(this.context, null);
bulkCopyMethod = fastestMethod.GetType().GetMyMethod(isAsync? "BulkMergeAsync" : "BulkMerge", 1);
}
private void _BulkMerge(DataTable dataTable, string[] whereColumns,string [] updateColumns, out object newValue, out object fastestMethod, out MethodInfo bulkCopyMethod, bool isAsync, bool isIdentity)
{
Check.ExceptionEasy(this.AsName.IsNullOrEmpty(), "need .AS(tablaeName) ", "需要 .AS(tablaeName) 设置表名");
var className = "BulkMerge_" + isIdentity + this.AsName.GetNonNegativeHashCodeString();
var builder = this.context.DynamicBuilder().CreateClass(className, new SugarTable()
{
TableName = this.AsName
});
foreach (DataColumn item in dataTable.Columns)
{
var isPrimaryKey = whereColumns.Any(it => it.EqualCase(item.ColumnName));
var propertyType = item.DataType;
if (!propertyType.IsClass() && propertyType != typeof(string) && propertyType != typeof(byte[]))
{
propertyType = typeof(Nullable<>).MakeGenericType(UtilMethods.GetUnderType(item.DataType));
}
builder.CreateProperty(item.ColumnName, propertyType, new SugarColumn()
{
IsPrimaryKey = isPrimaryKey,
IsIdentity = isIdentity && isPrimaryKey,
IsNullable = true,
});
}
var dicList = this.context.Utilities.DataTableToDictionaryList(dataTable);
var type = builder.WithCache().BuilderType();
var value = this.context.DynamicBuilder().CreateObjectByType(type, dicList);
newValue = UtilMethods.ConvertToObjectList(type, value);
fastestMethod = this.context.GetType()
.GetMethod("Fastest")
.MakeGenericMethod(type)
.Invoke(this.context, null);
bulkCopyMethod = fastestMethod.GetType().GetMyMethod(isAsync ? "BulkMergeAsync" : "BulkMerge", 3, newValue.GetType(), typeof(string[]), typeof(string[]));
}
private async Task<int> _BulkUpdate(List<T> datas, string[] whereColumns, string[] updateColumns)
{

View File

@@ -38,6 +38,8 @@ namespace SqlSugar
int BulkMerge(List<T> datas);
int BulkMerge(DataTable dataTable, string[] whereColumns,bool isIdentity);
Task<int> BulkMergeAsync(DataTable dataTable, string[] whereColumns, bool isIdentity);
int BulkMerge(DataTable dataTable, string[] whereColumns,string[] updateColumns, bool isIdentity);
Task<int> BulkMergeAsync(DataTable dataTable, string[] whereColumns, string[] updateColumns, bool isIdentity);
Task<int> BulkMergeAsync(List<T> datas, string[] whereColumns);
int BulkMerge(List<T> datas, string[] whereColumns);
Task<int> BulkMergeAsync(List<T> datas, string[] whereColumns, string[] updateColumns);