Update Fastest.BulkMege

This commit is contained in:
sunkaixuan 2023-10-04 20:23:45 +08:00
parent 90f57098ca
commit cbad3083ee
6 changed files with 25 additions and 8 deletions

View File

@ -48,9 +48,17 @@ namespace SqlSugar
dt.TableName = "#temp"; dt.TableName = "#temp";
} }
public virtual Task<int> Merge(DataTable dt, EntityInfo entityInfo,string[] whereColumns,string [] updateColumns) public async virtual Task<int> Merge<T>(DataTable dt, EntityInfo entityInfo, string[] whereColumns, string[] updateColumns, List<T> datas)
{ {
throw new Exception("当前数据库还没有支持Merge方法请联系作者支持"); var result = 0;
await this.Context.Utilities.PageEachAsync(datas,2000,async pageItems =>
{
var x = await this.Context.Storageable(pageItems).WhereColumns(whereColumns).ToStorageAsync();
result += await x.BulkCopyAsync();
result += await x.BulkUpdateAsync(updateColumns);
return result;
});
return result;
} }
} }
} }

View File

@ -218,7 +218,7 @@ namespace SqlSugar
buider.Context = context; buider.Context = context;
await buider.CreateTempAsync<T>(dt); await buider.CreateTempAsync<T>(dt);
await buider.ExecuteBulkCopyAsync(dt); await buider.ExecuteBulkCopyAsync(dt);
var result = await buider.Merge(dt, this.entityInfo,whereColumns,updateColumns); var result = await buider.Merge(dt, this.entityInfo,whereColumns,updateColumns, datas);
//var queryTemp = this.context.Queryable<T>().AS(dt.TableName).ToList();//test //var queryTemp = this.context.Queryable<T>().AS(dt.TableName).ToList();//test
//var result = await buider.UpdateByTempAsync(GetTableName(), dt.TableName, updateColumns, whereColumns); //var result = await buider.UpdateByTempAsync(GetTableName(), dt.TableName, updateColumns, whereColumns);
if (this.context.CurrentConnectionConfig.DbType != DbType.Sqlite) if (this.context.CurrentConnectionConfig.DbType != DbType.Sqlite)

View File

@ -18,6 +18,6 @@ namespace SqlSugar
Task<int> ExecuteBulkCopyAsync(DataTable dt); Task<int> ExecuteBulkCopyAsync(DataTable dt);
Task CreateTempAsync<T>(DataTable dt) where T : class, new(); Task CreateTempAsync<T>(DataTable dt) where T : class, new();
void CloseDb(); void CloseDb();
Task<int> Merge(DataTable dt, EntityInfo entityInfo, string[] whereColumns, string[] updateColumns); Task<int> Merge<T>(DataTable dt, EntityInfo entityInfo, string[] whereColumns, string[] updateColumns,List<T> datas);
} }
} }

View File

@ -1,5 +1,6 @@
using Oracle.ManagedDataAccess.Client; using Oracle.ManagedDataAccess.Client;
using System; using System;
using System.Collections.Generic;
using System.Data; using System.Data;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -66,7 +67,7 @@ namespace SqlSugar
} }
public override Task<int> Merge(DataTable dt, EntityInfo entityInfo, string[] whereColumns, string[] updateColumns) public override Task<int> Merge<T>(DataTable dt, EntityInfo entityInfo, string[] whereColumns, string[] updateColumns,List<T> datas)
{ {
Check.Exception(this.entityInfo.Columns.Any(it => it.OracleSequenceName.HasValue()), "The BulkMerge method cannot be used for sequence", "BulkMerge方法不能用序列"); Check.Exception(this.entityInfo.Columns.Any(it => it.OracleSequenceName.HasValue()), "The BulkMerge method cannot be used for sequence", "BulkMerge方法不能用序列");
var sqlBuilder = this.Context.Queryable<object>().SqlBuilder; var sqlBuilder = this.Context.Queryable<object>().SqlBuilder;

View File

@ -66,7 +66,7 @@ namespace SqlSugar
copy.BulkCopyTimeout = this.Context.Ado.CommandTimeOut; copy.BulkCopyTimeout = this.Context.Ado.CommandTimeOut;
return copy; return copy;
} }
public override Task<int> Merge(DataTable dt, EntityInfo entityInfo, string[] whereColumns, string[] updateColumns) public override Task<int> Merge<T>(DataTable dt, EntityInfo entityInfo, string[] whereColumns, string[] updateColumns, List<T> datas)
{ {
var sqlBuilder = this.Context.Queryable<object>().SqlBuilder; var sqlBuilder = this.Context.Queryable<object>().SqlBuilder;
var insertColumns = entityInfo.Columns var insertColumns = entityInfo.Columns

View File

@ -176,9 +176,17 @@ namespace SqlSugar
return result; return result;
} }
public Task<int> Merge(DataTable dt, EntityInfo entityInfo, string[] whereColumns, string[] updateColumns) public async Task<int> Merge<T>(DataTable dt, EntityInfo entityInfo, string[] whereColumns, string[] updateColumns, List<T> datas)
{ {
throw new Exception("未实现"); var result = 0;
await this.Context.Utilities.PageEachAsync(datas, 2000, async pageItems =>
{
var x = await this.Context.Storageable(pageItems).WhereColumns(whereColumns).ToStorageAsync();
result += await x.BulkCopyAsync();
result += await x.BulkUpdateAsync(updateColumns);
return result;
});
return result;
} }
} }
} }