mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 10:42:52 +08:00
- 增加 IInsertOrUpdate BatchOptions 选项;
This commit is contained in:
parent
c228332c4c
commit
0a048567b8
@ -96,6 +96,16 @@ namespace FreeSql
|
||||
/// <returns></returns>
|
||||
IInsertOrUpdate<T1> UpdateSet<TMember>(Expression<Func<T1, T1, TMember>> exp);
|
||||
|
||||
/// <summary>
|
||||
/// 批量执行选项设置,一般不需要使用该方法<para></para>
|
||||
/// 各数据库 rows 限制不一样,默认设置:200<para></para>
|
||||
/// 若没有事务传入,内部(默认)会自动开启新事务,保证拆包执行的完整性。
|
||||
/// </summary>
|
||||
/// <param name="rowsLimit">指定根据 rows 上限数量拆分执行</param>
|
||||
/// <param name="autoTransaction">是否自动开启事务</param>
|
||||
/// <returns></returns>
|
||||
IInsertOrUpdate<T1> BatchOptions(int rowsLimit, bool autoTransaction = true);
|
||||
|
||||
/// <summary>
|
||||
/// 设置表名规则,可用于分库/分表,参数1:默认表名;返回值:新表名;
|
||||
/// </summary>
|
||||
|
@ -27,6 +27,8 @@ namespace FreeSql.Internal.CommonProvider
|
||||
public TableInfo _table;
|
||||
public ColumnInfo[] _tempPrimarys;
|
||||
public Func<string, string> _tableRule;
|
||||
public int _batchValuesLimit;
|
||||
public bool _batchAutoTransaction = true;
|
||||
public DbParameter[] _params;
|
||||
public DbTransaction _transaction;
|
||||
public DbConnection _connection;
|
||||
@ -56,7 +58,13 @@ namespace FreeSql.Internal.CommonProvider
|
||||
{
|
||||
_source.Clear();
|
||||
_sourceSql = null;
|
||||
_doNothing = false;
|
||||
_updateIgnore.Clear();
|
||||
_auditValueChangedDict.Clear();
|
||||
_updateSetDict.Clear();
|
||||
_batchValuesLimit = 0;
|
||||
_batchAutoTransaction = false;
|
||||
_params = null;
|
||||
}
|
||||
|
||||
public IInsertOrUpdate<T1> WithTransaction(DbTransaction transaction)
|
||||
@ -204,6 +212,13 @@ namespace FreeSql.Internal.CommonProvider
|
||||
return this;
|
||||
}
|
||||
|
||||
public virtual IInsertOrUpdate<T1> BatchOptions(int valuesLimit, bool autoTransaction = true)
|
||||
{
|
||||
_batchValuesLimit = valuesLimit;
|
||||
_batchAutoTransaction = autoTransaction;
|
||||
return this;
|
||||
}
|
||||
|
||||
protected string TableRuleInvoke()
|
||||
{
|
||||
var tbname = _table?.DbName ?? "";
|
||||
@ -353,21 +368,33 @@ namespace FreeSql.Internal.CommonProvider
|
||||
if (threadTransaction != null) this.WithTransaction(threadTransaction);
|
||||
}
|
||||
|
||||
if (_transaction != null || _orm.Ado.MasterPool == null)
|
||||
if (_transaction != null || _orm.Ado.MasterPool == null || _batchAutoTransaction == false)
|
||||
{
|
||||
_SplitSourceByIdentityValueIsNullFlag = 1;
|
||||
foreach (var tmpsource in ss.Item1)
|
||||
{
|
||||
_source = tmpsource;
|
||||
var pageTotal = Math.Ceiling(tmpsource.Count * 1.0 / _batchValuesLimit);
|
||||
for (var pageNumber = 1; pageNumber <= pageTotal; pageNumber++)
|
||||
{
|
||||
_source = pageNumber > 1 ?
|
||||
tmpsource.Skip((pageNumber - 1) * _batchValuesLimit).Take(_batchValuesLimit).ToList() :
|
||||
tmpsource.Take(_batchValuesLimit).ToList();
|
||||
affrows += this.RawExecuteAffrows();
|
||||
}
|
||||
}
|
||||
_SplitSourceByIdentityValueIsNullFlag = 2;
|
||||
foreach (var tmpsource in ss.Item2)
|
||||
{
|
||||
_source = tmpsource;
|
||||
var pageTotal = Math.Ceiling(tmpsource.Count * 1.0 / _batchValuesLimit);
|
||||
for (var pageNumber = 1; pageNumber <= pageTotal; pageNumber++)
|
||||
{
|
||||
_source = pageNumber > 1 ?
|
||||
tmpsource.Skip((pageNumber - 1) * _batchValuesLimit).Take(_batchValuesLimit).ToList() :
|
||||
tmpsource.Take(_batchValuesLimit).ToList();
|
||||
affrows += this.RawExecuteAffrows();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
using (var conn = _orm.Ado.MasterPool.Get())
|
||||
@ -380,15 +407,27 @@ namespace FreeSql.Internal.CommonProvider
|
||||
_SplitSourceByIdentityValueIsNullFlag = 1;
|
||||
foreach (var tmpsource in ss.Item1)
|
||||
{
|
||||
_source = tmpsource;
|
||||
var pageTotal = Math.Ceiling(tmpsource.Count * 1.0 / _batchValuesLimit);
|
||||
for (var pageNumber = 1; pageNumber <= pageTotal; pageNumber++)
|
||||
{
|
||||
_source = pageNumber > 1 ?
|
||||
tmpsource.Skip((pageNumber - 1) * _batchValuesLimit).Take(_batchValuesLimit).ToList() :
|
||||
tmpsource.Take(_batchValuesLimit).ToList();
|
||||
affrows += this.RawExecuteAffrows();
|
||||
}
|
||||
}
|
||||
_SplitSourceByIdentityValueIsNullFlag = 2;
|
||||
foreach (var tmpsource in ss.Item2)
|
||||
{
|
||||
_source = tmpsource;
|
||||
var pageTotal = Math.Ceiling(tmpsource.Count * 1.0 / _batchValuesLimit);
|
||||
for (var pageNumber = 1; pageNumber <= pageTotal; pageNumber++)
|
||||
{
|
||||
_source = pageNumber > 1 ?
|
||||
tmpsource.Skip((pageNumber - 1) * _batchValuesLimit).Take(_batchValuesLimit).ToList() :
|
||||
tmpsource.Take(_batchValuesLimit).ToList();
|
||||
affrows += this.RawExecuteAffrows();
|
||||
}
|
||||
}
|
||||
_transaction.Commit();
|
||||
_orm.Aop.TraceAfterHandler?.Invoke(this, new Aop.TraceAfterEventArgs(transBefore, CoreStrings.Commit, null));
|
||||
}
|
||||
@ -461,7 +500,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
}
|
||||
async public Task<int> ExecuteAffrowsAsync(CancellationToken cancellationToken = default)
|
||||
{
|
||||
if (_sourceSql != null) return this.RawExecuteAffrows();
|
||||
if (_sourceSql != null) return await this.RawExecuteAffrowsAsync(cancellationToken);
|
||||
var affrows = 0;
|
||||
var ss = SplitSourceByIdentityValueIsNull(_source);
|
||||
try
|
||||
@ -472,21 +511,33 @@ namespace FreeSql.Internal.CommonProvider
|
||||
if (threadTransaction != null) this.WithTransaction(threadTransaction);
|
||||
}
|
||||
|
||||
if (_transaction != null || _orm.Ado.MasterPool == null)
|
||||
if (_transaction != null || _orm.Ado.MasterPool == null || _batchAutoTransaction == false)
|
||||
{
|
||||
_SplitSourceByIdentityValueIsNullFlag = 1;
|
||||
foreach (var tmpsource in ss.Item1)
|
||||
{
|
||||
_source = tmpsource;
|
||||
var pageTotal = Math.Ceiling(tmpsource.Count * 1.0 / _batchValuesLimit);
|
||||
for (var pageNumber = 1; pageNumber <= pageTotal; pageNumber++)
|
||||
{
|
||||
_source = pageNumber > 1 ?
|
||||
tmpsource.Skip((pageNumber - 1) * _batchValuesLimit).Take(_batchValuesLimit).ToList() :
|
||||
tmpsource.Take(_batchValuesLimit).ToList();
|
||||
affrows += await this.RawExecuteAffrowsAsync(cancellationToken);
|
||||
}
|
||||
}
|
||||
_SplitSourceByIdentityValueIsNullFlag = 2;
|
||||
foreach (var tmpsource in ss.Item2)
|
||||
{
|
||||
_source = tmpsource;
|
||||
var pageTotal = Math.Ceiling(tmpsource.Count * 1.0 / _batchValuesLimit);
|
||||
for (var pageNumber = 1; pageNumber <= pageTotal; pageNumber++)
|
||||
{
|
||||
_source = pageNumber > 1 ?
|
||||
tmpsource.Skip((pageNumber - 1) * _batchValuesLimit).Take(_batchValuesLimit).ToList() :
|
||||
tmpsource.Take(_batchValuesLimit).ToList();
|
||||
affrows += await this.RawExecuteAffrowsAsync(cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
using (var conn = await _orm.Ado.MasterPool.GetAsync())
|
||||
@ -499,15 +550,27 @@ namespace FreeSql.Internal.CommonProvider
|
||||
_SplitSourceByIdentityValueIsNullFlag = 1;
|
||||
foreach (var tmpsource in ss.Item1)
|
||||
{
|
||||
_source = tmpsource;
|
||||
var pageTotal = Math.Ceiling(tmpsource.Count * 1.0 / _batchValuesLimit);
|
||||
for (var pageNumber = 1; pageNumber <= pageTotal; pageNumber++)
|
||||
{
|
||||
_source = pageNumber > 1 ?
|
||||
tmpsource.Skip((pageNumber - 1) * _batchValuesLimit).Take(_batchValuesLimit).ToList() :
|
||||
tmpsource.Take(_batchValuesLimit).ToList();
|
||||
affrows += await this.RawExecuteAffrowsAsync(cancellationToken);
|
||||
}
|
||||
}
|
||||
_SplitSourceByIdentityValueIsNullFlag = 2;
|
||||
foreach (var tmpsource in ss.Item2)
|
||||
{
|
||||
_source = tmpsource;
|
||||
var pageTotal = Math.Ceiling(tmpsource.Count * 1.0 / _batchValuesLimit);
|
||||
for (var pageNumber = 1; pageNumber <= pageTotal; pageNumber++)
|
||||
{
|
||||
_source = pageNumber > 1 ?
|
||||
tmpsource.Skip((pageNumber - 1) * _batchValuesLimit).Take(_batchValuesLimit).ToList() :
|
||||
tmpsource.Take(_batchValuesLimit).ToList();
|
||||
affrows += await this.RawExecuteAffrowsAsync(cancellationToken);
|
||||
}
|
||||
}
|
||||
_transaction.Commit();
|
||||
_orm.Aop.TraceAfterHandler?.Invoke(this, new Aop.TraceAfterEventArgs(transBefore, CoreStrings.Commit, null));
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user