mirror of
https://github.com/dotnetcore/FreeSql.git
synced 2026-02-17 22:00:56 +08:00
- 优化 DbSet/Repository 删除多主键分批300,防止 SQL AND OR 过长问题;
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 ..)
|
||||
|
||||
@@ -540,7 +540,6 @@ namespace FreeSql.Internal
|
||||
}
|
||||
if (dywhere is IEnumerable)
|
||||
{
|
||||
|
||||
var sb = new StringBuilder();
|
||||
var ie = dywhere as IEnumerable;
|
||||
var ieSingle = LocalGetSingleElement(ie);
|
||||
|
||||
Reference in New Issue
Block a user