diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs index 67de9f7e1..864281b68 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs +++ b/Src/Asp.NetCore2/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.NetCore2/SqlSugar/Interface/IQueryable.cs b/Src/Asp.NetCore2/SqlSugar/Interface/IQueryable.cs index 2162cc0dd..ecce5e045 100644 --- a/Src/Asp.NetCore2/SqlSugar/Interface/IQueryable.cs +++ b/Src/Asp.NetCore2/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);