- 优化 DbSet/Repository 删除多主键分批300,防止 SQL AND OR 过长问题;

This commit is contained in:
2881099
2024-11-05 11:32:41 +08:00
parent 01a0bfda63
commit fa0e5ba0e2
5 changed files with 35 additions and 7 deletions

View File

@@ -418,7 +418,16 @@ namespace FreeSql
async Task<int> DbContextBatchRemoveAsync(EntityState[] dels, CancellationToken cancellationToken)
{
if (dels.Any() == false) return 0;
var affrows = await this.OrmDelete(dels.Select(a => a.Value)).ExecuteAffrowsAsync(cancellationToken);
var affrows = 0;
if (_table.Primarys.Length == 1)
affrows = await this.OrmDelete(dels.Select(a => a.Value)).ExecuteAffrowsAsync(cancellationToken);
else
{
var takeMax = 300;
var execCount = (int)Math.Ceiling(1.0 * dels.Length / takeMax);
for (var a = 0; a < execCount; a++)
affrows += await this.OrmDelete(dels.Skip(a * takeMax).Take(Math.Min(takeMax, dels.Length - a * takeMax)).Select(d => d.Value)).ExecuteAffrowsAsync(cancellationToken);
}
_db._entityChangeReport.AddRange(dels.Select(a => new DbContext.EntityChangeReport.ChangeInfo { EntityType = _entityType, Object = a.Value, Type = DbContext.EntityChangeType.Delete }));
return affrows;
}

View File

@@ -450,7 +450,16 @@ namespace FreeSql
int DbContextBatchRemove(EntityState[] dels)
{
if (dels.Any() == false) return 0;
var affrows = this.OrmDelete(dels.Select(a => a.Value)).ExecuteAffrows();
var affrows = 0;
if (_table.Primarys.Length == 1)
affrows = this.OrmDelete(dels.Select(a => a.Value)).ExecuteAffrows();
else
{
var takeMax = 300;
var execCount = (int)Math.Ceiling(1.0 * dels.Length / takeMax);
for (var a = 0; a < execCount; a++)
affrows += this.OrmDelete(dels.Skip(a * takeMax).Take(Math.Min(takeMax, dels.Length - a * takeMax)).Select(d => d.Value)).ExecuteAffrows();
}
_db._entityChangeReport.AddRange(dels.Select(a => new DbContext.EntityChangeReport.ChangeInfo { EntityType = _entityType, Object = a.Value, Type = DbContext.EntityChangeType.Delete }));
return affrows; //https://github.com/dotnetcore/FreeSql/issues/373
}

View File

@@ -775,5 +775,13 @@
<param name="that"></param>
<returns></returns>
</member>
<member name="M:Microsoft.Extensions.DependencyInjection.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Reflection.Assembly[])">
<summary>
批量注入 Repository可以参考代码自行调整
</summary>
<param name="services"></param>
<param name="assemblies"></param>
<returns></returns>
</member>
</members>
</doc>

View File

@@ -1347,10 +1347,6 @@ namespace FreeSql.Internal
break;
}
break;
case "ToOne":
case "First":
fsqlSelect0._limit = 1; //#462
break;
}
if (tsc.dbParams != null) fsqlSelect0._params = tsc.dbParams;
fsqltables = fsqlSelect0._tables;
@@ -1774,6 +1770,13 @@ namespace FreeSql.Internal
case "ToList":
case "ToOne":
case "First":
switch (exp3.Method.Name)
{
case "ToOne":
case "First":
fsqlSelect0._limit = 1; //#462
break;
}
var tscClone2 = tsc.CloneDisableDiyParse();
var fsqlSelect0p = fsql as Select0Provider;
tscClone2.subSelect001 = fsqlSelect0p; //#405 Oracle within group(order by ..)

View File

@@ -540,7 +540,6 @@ namespace FreeSql.Internal
}
if (dywhere is IEnumerable)
{
var sb = new StringBuilder();
var ie = dywhere as IEnumerable;
var ieSingle = LocalGetSingleElement(ie);