mirror of
https://github.com/dotnetcore/FreeSql.git
synced 2026-02-18 22:30: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)
|
async Task<int> DbContextBatchRemoveAsync(EntityState[] dels, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
if (dels.Any() == false) return 0;
|
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 }));
|
_db._entityChangeReport.AddRange(dels.Select(a => new DbContext.EntityChangeReport.ChangeInfo { EntityType = _entityType, Object = a.Value, Type = DbContext.EntityChangeType.Delete }));
|
||||||
return affrows;
|
return affrows;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -450,7 +450,16 @@ namespace FreeSql
|
|||||||
int DbContextBatchRemove(EntityState[] dels)
|
int DbContextBatchRemove(EntityState[] dels)
|
||||||
{
|
{
|
||||||
if (dels.Any() == false) return 0;
|
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 }));
|
_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
|
return affrows; //https://github.com/dotnetcore/FreeSql/issues/373
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -775,5 +775,13 @@
|
|||||||
<param name="that"></param>
|
<param name="that"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</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>
|
</members>
|
||||||
</doc>
|
</doc>
|
||||||
|
|||||||
@@ -1347,10 +1347,6 @@ namespace FreeSql.Internal
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "ToOne":
|
|
||||||
case "First":
|
|
||||||
fsqlSelect0._limit = 1; //#462
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
if (tsc.dbParams != null) fsqlSelect0._params = tsc.dbParams;
|
if (tsc.dbParams != null) fsqlSelect0._params = tsc.dbParams;
|
||||||
fsqltables = fsqlSelect0._tables;
|
fsqltables = fsqlSelect0._tables;
|
||||||
@@ -1774,6 +1770,13 @@ namespace FreeSql.Internal
|
|||||||
case "ToList":
|
case "ToList":
|
||||||
case "ToOne":
|
case "ToOne":
|
||||||
case "First":
|
case "First":
|
||||||
|
switch (exp3.Method.Name)
|
||||||
|
{
|
||||||
|
case "ToOne":
|
||||||
|
case "First":
|
||||||
|
fsqlSelect0._limit = 1; //#462
|
||||||
|
break;
|
||||||
|
}
|
||||||
var tscClone2 = tsc.CloneDisableDiyParse();
|
var tscClone2 = tsc.CloneDisableDiyParse();
|
||||||
var fsqlSelect0p = fsql as Select0Provider;
|
var fsqlSelect0p = fsql as Select0Provider;
|
||||||
tscClone2.subSelect001 = fsqlSelect0p; //#405 Oracle within group(order by ..)
|
tscClone2.subSelect001 = fsqlSelect0p; //#405 Oracle within group(order by ..)
|
||||||
|
|||||||
@@ -540,7 +540,6 @@ namespace FreeSql.Internal
|
|||||||
}
|
}
|
||||||
if (dywhere is IEnumerable)
|
if (dywhere is IEnumerable)
|
||||||
{
|
{
|
||||||
|
|
||||||
var sb = new StringBuilder();
|
var sb = new StringBuilder();
|
||||||
var ie = dywhere as IEnumerable;
|
var ie = dywhere as IEnumerable;
|
||||||
var ieSingle = LocalGetSingleElement(ie);
|
var ieSingle = LocalGetSingleElement(ie);
|
||||||
|
|||||||
Reference in New Issue
Block a user