From fa0e5ba0e260592ac3f319134ce3a3b1d9ae0c0a Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Tue, 5 Nov 2024 11:32:41 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20DbSet/Repository=20?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=B8=BB=E9=94=AE=E5=88=86=E6=89=B9?= =?UTF-8?q?300=EF=BC=8C=E9=98=B2=E6=AD=A2=20SQL=20AND=20OR=20=E8=BF=87?= =?UTF-8?q?=E9=95=BF=E9=97=AE=E9=A2=98=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/DbSet/DbSetAsync.cs | 11 ++++++++++- FreeSql.DbContext/DbSet/DbSetSync.cs | 11 ++++++++++- FreeSql.DbContext/FreeSql.DbContext.xml | 8 ++++++++ FreeSql/Internal/CommonExpression.cs | 11 +++++++---- FreeSql/Internal/CommonUtils.cs | 1 - 5 files changed, 35 insertions(+), 7 deletions(-) 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);