/// <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.EnsureConnectionAsync(cancellationToken); DataConnection.InitCommand(CommandType, CommandText, Parameters, null); 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)); } }