From 2e711c594d6467230187d17da54d185fe2b571a3 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Wed, 27 Mar 2024 12:18:55 +0800 Subject: [PATCH] Synchronization code --- .../QueryableProvider/QueryableExecuteSql.cs | 55 +++++++++++++++++++ .../SugarProvider/SqlSugarAccessory.cs | 3 + Src/Asp.Net/SqlSugar/Interface/IQueryable.cs | 2 + 3 files changed, 60 insertions(+) diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs index 67de9f7e1..864281b68 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs @@ -641,7 +641,62 @@ namespace SqlSugar var newResult = fieldsHelper.GetSetList(obj, listObj, mappings).Select(it => (T)it).ToList(); return newResult; } + public void ForEachDataReader(Action action) + { + var queryable = this.Clone(); + var sql = queryable.ToSql(); + var dr = this.Context.Ado.GetDataReader(sql.Key,sql.Value); + var entityInfo = this.Context.EntityMaintenance.GetEntityInfo(); + var columns = entityInfo.Columns.Where(it => it.IsIgnore == false).ToList(); + var cacheKey = "ForEachDataReader"+typeof(T).GetHashCode()+string.Join(",", columns.Select(it => it.PropertyName)); + IDataReaderEntityBuilder entytyList = this.Context.Utilities.GetReflectionInoCacheInstance().GetOrCreate("cacheKey", () => + { + var cacheResult = new IDataReaderEntityBuilder(this.Context, dr, + columns.Select(it=>it.DbColumnName).ToList()).CreateBuilder(typeof(T)); + return cacheResult; + }); + using (dr) + { + while (dr.Read()) + { + var order = entytyList.Build(dr); + action(order); + } + } + if (this.Context.CurrentConnectionConfig.IsAutoCloseConnection) + { + this.Context.Ado.Close(); + } + } + public async Task ForEachDataReaderAsync(Action action) + { + var queryable = this.Clone(); + var sql = queryable.ToSql(); + var dr =await this.Context.Ado.GetDataReaderAsync(sql.Key, sql.Value); + var entityInfo = this.Context.EntityMaintenance.GetEntityInfo(); + var columns = entityInfo.Columns.Where(it => it.IsIgnore == false).ToList(); + var cacheKey = "ForEachDataReader" + typeof(T).GetHashCode() + string.Join(",", columns.Select(it => it.PropertyName)); + IDataReaderEntityBuilder entytyList = this.Context.Utilities.GetReflectionInoCacheInstance().GetOrCreate("cacheKey", () => + { + var cacheResult = new IDataReaderEntityBuilder(this.Context, dr, + columns.Select(it => it.DbColumnName).ToList()).CreateBuilder(typeof(T)); + return cacheResult; + }); + using (dr) + { + while (dr.Read()) + { + + var order = entytyList.Build(dr); + action(order); + } + } + if (this.Context.CurrentConnectionConfig.IsAutoCloseConnection) + { + this.Context.Ado.Close(); + } + } 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")); diff --git a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarAccessory.cs b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarAccessory.cs index 8691d51b4..1b41e1009 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarAccessory.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarAccessory.cs @@ -508,6 +508,9 @@ namespace SqlSugar break; case DbType.Doris: config.DbType = DbType.MySql; + if (this.CurrentConnectionConfig.MoreSettings == null) + this.CurrentConnectionConfig.MoreSettings = new ConnMoreSettings(); + this.CurrentConnectionConfig.MoreSettings.DatabaseModel = DbType.Doris; break; case DbType.TDengine: Check.Exception(SugarCompatible.IsFramework, "TDengine only support .net core"); diff --git a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs index 2162cc0dd..ecce5e045 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs @@ -165,6 +165,8 @@ namespace SqlSugar ISugarQueryable Select(string select); ISugarQueryable SelectMergeTable(Expression> expression); ISugarQueryable MergeTable(); + void ForEachDataReader(Action action); + Task ForEachDataReaderAsync(Action action); void ForEach(Action action, int singleMaxReads = 300, System.Threading.CancellationTokenSource cancellationTokenSource = null); Task ForEachAsync(Action action, int singleMaxReads = 300, System.Threading.CancellationTokenSource cancellationTokenSource = null); void ForEachByPage(Action action, int pageIndex, int pageSize, ref int totalNumber, int singleMaxReads = 300, System.Threading.CancellationTokenSource cancellationTokenSource = null);