Exemple #1
0
        /// <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;
                            }
                        }
                    }
                }