From 4f61d7e03b3c082fc5238e1a14f185875d76469a Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sun, 27 Mar 2022 21:11:14 +0800 Subject: [PATCH] Add Queryable.Foreach --- .../SqlServerTest/Demo/Demo1_Queryable.cs | 7 +++++++ .../QueryableProvider/QueryableProvider.cs | 17 +++++++++++++++++ Src/Asp.Net/SqlSugar/Interface/IQueryable.cs | 1 + 3 files changed, 25 insertions(+) diff --git a/Src/Asp.Net/SqlServerTest/Demo/Demo1_Queryable.cs b/Src/Asp.Net/SqlServerTest/Demo/Demo1_Queryable.cs index d265449c4..f088d721e 100644 --- a/Src/Asp.Net/SqlServerTest/Demo/Demo1_Queryable.cs +++ b/Src/Asp.Net/SqlServerTest/Demo/Demo1_Queryable.cs @@ -185,6 +185,13 @@ namespace OrmTest var test30= db.Queryable().Select(it => new { x = SqlFunc.LessThanOrEqual(1, 2) }).ToList(); var test31 = db.Queryable().Select(it => new { x = SqlFunc.GreaterThan(1, 2) }).ToList(); var test32 = db.Queryable().Select(it => new { x = SqlFunc.GreaterThanOrEqual(1, 2) }).ToList(); + List result = new List(); + db.Queryable().ForEach(it => + { + result.Add(it); + + },10); + var test33= db.Queryable().ToList(); Console.WriteLine("#### Examples End ####"); } diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index 9d17fd3ea..d0f29ff2c 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -1276,6 +1276,23 @@ namespace SqlSugar InitMapping(); return _ToList(); } + public virtual void ForEach(Action action, int singleMaxReads = 300,System.Threading.CancellationTokenSource cancellationTokenSource = null) + { + Check.Exception(this.QueryBuilder.Skip > 0 || this.QueryBuilder.Take > 0, ErrorMessage.GetThrowMessage("no support Skip take, use PageForEach", "不支持Skip Take,请使用 Queryale.PageForEach")); + var totalNumber = 0; + var totalPage = 1; + for (int i = 1; i <= totalPage; i++) + { + if (cancellationTokenSource?.IsCancellationRequested == true) return; + var queryable = this.Clone(); + var page = queryable.ToPageList(i, singleMaxReads, ref totalNumber, ref totalPage); + foreach (var item in page) + { + if (cancellationTokenSource?.IsCancellationRequested == true) return; + action.Invoke(item); + } + } + } public List ToOffsetPage(int pageIndex, int pageSize) { if (this.Context.CurrentConnectionConfig.DbType != DbType.SqlServer) diff --git a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs index edb8e0e70..3a0c56df6 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs @@ -108,6 +108,7 @@ namespace SqlSugar ISugarQueryable Select(string select); ISugarQueryable Select(string select); ISugarQueryable MergeTable(); + void ForEach(Action action, int singleMaxReads = 300, System.Threading.CancellationTokenSource cancellationTokenSource = null); int Count(); Task CountAsync();