diff --git a/FreeSql.DbContext/DbSet/DbSetAsync.cs b/FreeSql.DbContext/DbSet/DbSetAsync.cs index 42ad2ca8b..31231e5b1 100644 --- a/FreeSql.DbContext/DbSet/DbSetAsync.cs +++ b/FreeSql.DbContext/DbSet/DbSetAsync.cs @@ -418,7 +418,16 @@ namespace FreeSql async Task 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; } diff --git a/FreeSql.DbContext/DbSet/DbSetSync.cs b/FreeSql.DbContext/DbSet/DbSetSync.cs index 660acaad8..3cf7b2190 100644 --- a/FreeSql.DbContext/DbSet/DbSetSync.cs +++ b/FreeSql.DbContext/DbSet/DbSetSync.cs @@ -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 } diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 38ae854fd..7bd2291ce 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -775,5 +775,13 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index b05aee762..8181b067e 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -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 ..) diff --git a/FreeSql/Internal/CommonUtils.cs b/FreeSql/Internal/CommonUtils.cs index 1f960f18e..dd93f7010 100644 --- a/FreeSql/Internal/CommonUtils.cs +++ b/FreeSql/Internal/CommonUtils.cs @@ -540,7 +540,6 @@ namespace FreeSql.Internal } if (dywhere is IEnumerable) { - var sb = new StringBuilder(); var ie = dywhere as IEnumerable; var ieSingle = LocalGetSingleElement(ie);