/// <summary> /// Great of huge result sets, process one row at the time /// </summary> /// <typeparam name="T"></typeparam> /// <param name="cmd"></param> /// <param name="processor">Result processor</param> /// <param name="mapper"></param> /// <param name="firstRowOnly"></param> public static void QueryAndProcess <T>(this DbCommand cmd, Func <T, bool> processor, Func <DbDataReader, T> mapper = null, bool firstRowOnly = false) { try { CommandBehavior behavior = firstRowOnly ? CommandBehavior.SingleRow : CommandBehavior.Default; using (var reader = cmd.ExecuteReader(behavior)) { SqlFuManager.Config.OnCommand(cmd); while (reader.Read()) { if (!processor(SqlFuManager.GetMapper(mapper, cmd.CommandText)(reader))) { break; } } } } catch (DbException ex) { SqlFuManager.Config.OnException(cmd, ex); throw; } }
/// <summary> /// Executes an async query then processes each result /// </summary> /// <typeparam name="T"></typeparam> /// <param name="cmd"></param> /// <param name="cancellation"></param> /// <param name="processor">Delegate to process a result item. Return false from delegate to end the query</param> /// <param name="mapper"></param> /// <param name="firstRowOnly"></param> /// <returns></returns> public static async Task QueryAndProcessAsync <T>(this DbCommand cmd, CancellationToken cancellation, Func <T, bool> processor, Func <DbDataReader, T> mapper = null, bool firstRowOnly = false) { try { CommandBehavior behavior = firstRowOnly ? CommandBehavior.SingleRow : CommandBehavior.Default; using (var reader = await cmd.ExecuteReaderAsync(behavior, cancellation).ConfigureAwait(false)) { SqlFuManager.Config.OnCommand(cmd); while (await reader.ReadAsync(cancellation).ConfigureAwait(false)) { if (!processor(SqlFuManager.GetMapper(mapper, cmd.CommandText)(reader))) { break; } } } } catch (DbException ex) { SqlFuManager.Config.OnException(cmd, ex); throw; } }
/// <summary> /// Great of huge result sets, process one row at the time /// </summary> /// <typeparam name="T"></typeparam> /// <param name="cmd"></param> /// <param name="processor">Result processor</param> /// <param name="mapper"></param> /// <param name="firstRowOnly"></param> public static void QueryAndProcess <T>(this DbCommand cmd, Func <T, bool> processor, Func <DbDataReader, T> mapper = null, bool firstRowOnly = false) { var fuCommand = cmd.CastAs <SqlFuCommand>(); var strat = fuCommand.GetErrorsStrategy(); CommandBehavior behavior = firstRowOnly ? CommandBehavior.SingleRow : CommandBehavior.Default; SqlFuCommand.HandleTransients(cmd, () => { using (var reader = cmd.ExecuteReader(behavior)) { while (reader.Read()) { if (!processor(SqlFuManager.GetMapper(mapper, cmd.CommandText)(reader))) { break; } } } }, strat, fuCommand.Provider); }
/// <summary> /// Executes an async query then processes each result /// </summary> /// <typeparam name="T"></typeparam> /// <param name="cmd"></param> /// <param name="cancellation"></param> /// <param name="processor">Delegate to process a result item. Return false from delegate to end the query</param> /// <param name="mapper"></param> /// <param name="firstRowOnly"></param> /// <returns></returns> public static Task QueryAndProcessAsync <T>(this DbCommand cmd, CancellationToken cancellation, Func <T, bool> processor, Func <DbDataReader, T> mapper = null, bool firstRowOnly = false) { var fuCommand = cmd.CastAs <SqlFuCommand>(); var strat = fuCommand.GetErrorsStrategy(); CommandBehavior behavior = firstRowOnly ? CommandBehavior.SingleRow : CommandBehavior.Default; return(SqlFuCommand.HandleTransientsAsync(cmd, async(c) => { using (var reader = await cmd.ExecuteReaderAsync(behavior, c).ConfigureFalse()) { while (await reader.ReadAsync(c).ConfigureFalse()) { if (!processor(SqlFuManager.GetMapper(mapper, cmd.CommandText)(reader))) { break; } } } }, strat, fuCommand.Provider, cancellation)); }