/// <summary> /// Executes command asynchronously and apply provided action to each record, mapped using provided mapping function. /// </summary> /// <typeparam name="T">Result record type.</typeparam> /// <param name="objectReader">Record mapping function from data reader.</param> /// <param name="action">Action, applied to each result record.</param> /// <param name="cancellationToken">Asynchronous operation cancellation token.</param> /// <returns>Returns task.</returns> public async Task QueryForEachAsync <T>(Func <IDataReader, T> objectReader, Action <T> action, CancellationToken cancellationToken) { await DataConnection.InitCommandAsync(CommandType, CommandText, Parameters, cancellationToken); if (Parameters != null && Parameters.Length > 0) { SetParameters(DataConnection, Parameters); } using (var rd = await DataConnection.ExecuteReaderAsync(GetCommandBehavior(), cancellationToken)) while (await rd.ReadAsync(cancellationToken)) { action(objectReader(rd)); } }
async Task IDataReaderAsync.QueryForEachAsync <T>(Func <IDataReader, T> objectReader, Func <T, bool> action, CancellationToken cancellationToken) { using (var reader = await _dataConnection.ExecuteReaderAsync(CommandBehavior.Default, cancellationToken)) { var skip = _skipAction == null ? 0 : _skipAction(); while (skip-- > 0 && await reader.ReadAsync(cancellationToken)) { } var take = _takeAction == null ? int.MaxValue : _takeAction(); while (take-- > 0 && await reader.ReadAsync(cancellationToken)) { if (!action(objectReader(reader))) { return; } } } }