Пример #1
0
        /// <summary>
        /// 异步执行查询文本并返回一个 <see cref="IDataReader"/>。
        /// </summary>
        /// <param name="queryCommand">查询命令。</param>
        /// <param name="segment">数据分段对象。</param>
        /// <param name="parameters">查询参数集合。</param>
        /// <returns>一个 <see cref="IDataReader"/> 对象。</returns>
        public async virtual Task <IDataReader> ExecuteReaderAsync(IQueryCommand queryCommand, IDataSegment segment = null, ParameterCollection parameters = null)
        {
            Guard.ArgumentNull(queryCommand, "queryCommand");
            return(await UsingConnection(() =>
            {
                using (var command = CreateDbCommand(queryCommand, parameters))
                {
                    try
                    {
                        Task <DbDataReader> reader = null;
                        var context = new CommandContext(this, command, segment, parameters);
                        OnCommandExecuted(command, segment, parameters, TimeWatcher.Watch(() => ProcessSegmentCommand(context, () => reader = command.ExecuteReaderAsync())));

                        command.SyncParameters(parameters);
                        command.ClearParameters();

                        return reader;
                    }
                    catch (DbException exp)
                    {
                        TrackFailedLog(command, exp);

                        throw new CommandException(command, exp);
                    }
                }
            }));
        }
Пример #2
0
        /// <summary>
        /// 异步的,执行查询文本并将结果并返回动态序列。
        /// </summary>
        /// <param name="queryCommand">查询命令。</param>
        /// <param name="segment">数据分段对象。</param>
        /// <param name="parameters">查询参数集合。</param>
        /// <param name="cancellationToken">取消操作的通知。</param>
        /// <returns>一个动态对象的枚举器。</returns>
        public virtual async IAsyncEnumerable <dynamic> ExecuteEnumerableAsync(IQueryCommand queryCommand, IDataSegment segment = null, ParameterCollection parameters = null, CancellationToken cancellationToken = default)
        {
            Guard.ArgumentNull(queryCommand, nameof(queryCommand));

            using (var reader = (DbDataReader)(await ExecuteReaderAsync(queryCommand, segment, parameters, cancellationToken)))
            {
                var wrapper = Provider.GetService <IRecordWrapper>();
                TypeDescriptorUtility.AddDefaultDynamicProvider();

                while (await reader.ReadAsync(cancellationToken))
                {
                    var expando    = new ExpandoObject();
                    var dictionary = (IDictionary <string, object>)expando;

                    for (var i = 0; i < reader.FieldCount; i++)
                    {
                        var name = wrapper.GetFieldName(reader, i);
                        if (name.Equals("ROW_NUM"))
                        {
                            continue;
                        }

                        dictionary.Add(wrapper.GetFieldName(reader, i), RecordWrapHelper.GetValue(wrapper, reader, i));
                    }

                    yield return(expando);
                }
            }
        }
Пример #3
0
        /// <summary>
        /// 根据自定义的SQL语句查询返回一组动态对象。
        /// </summary>
        /// <param name="queryCommand">查询命令。</param>
        /// <param name="segment">数据分段对象。</param>
        /// <param name="parameters">查询参数集合。</param>
        /// <returns>一个动态对象的枚举器。</returns>
        public virtual IEnumerable <object> ExecuteEnumerable(IQueryCommand queryCommand, IDataSegment segment = null, ParameterCollection parameters = null)
        {
            Guard.ArgumentNull(queryCommand, "queryCommand");

            using (var reader = ExecuteReader(queryCommand, segment, parameters))
            {
                var wrapper = Provider.GetService <IRecordWrapper>();
#if !N35 && DYNAMIC
                TypeDescriptorUtility.AddDefaultDynamicProvider();

                while (reader.Read())
                {
                    var expando    = new ExpandoObject();
                    var dictionary = (IDictionary <string, object>)expando;

                    for (var i = 0; i < reader.FieldCount; i++)
                    {
                        dictionary.Add(wrapper.GetFieldName(reader, i), RecordWrapHelper.GetValue(wrapper, reader, i));
                    }
                    yield return(expando);
                }
#else
                var builder     = new DataReaderTypeBuilder(reader);
                var elementType = builder.CreateType();
                while (reader.Read())
                {
                    yield return(elementType.New(reader, wrapper));
                }
#endif
            }
        }
Пример #4
0
        /// <summary>
        /// 异步执行查询文本,并返回第一行的第一列。
        /// </summary>
        /// <param name="queryCommand">查询命令。</param>
        /// <param name="parameters">查询参数集合。</param>
        /// <returns>第一行的第一列数据。</returns>
        public async virtual Task <object> ExecuteScalarAsync(IQueryCommand queryCommand, ParameterCollection parameters = null)
        {
            Guard.ArgumentNull(queryCommand, "queryCommand");
            return(await UsingConnection(() =>
            {
                using (var command = CreateDbCommand(queryCommand, parameters))
                {
                    try
                    {
                        Task <object> result = null;
                        OnCommandExecuted(command, null, parameters, TimeWatcher.Watch(() => result = command.ExecuteScalarAsync()));

                        command.SyncParameters(parameters);
                        command.ClearParameters();
                        return result;
                    }
                    catch (DbException exp)
                    {
                        if (ConnectionString.IsTracking && Track != null)
                        {
                            Track.Fail(command, exp);
                        }

                        throw new CommandException(command, exp);
                    }
                }
            }));
        }
Пример #5
0
        /// <summary>
        /// 根据自定义的SQL语句查询返回一组动态对象。
        /// </summary>
        /// <param name="queryCommand">查询命令。</param>
        /// <param name="segment">数据分段对象。</param>
        /// <param name="parameters">查询参数集合。</param>
        /// <returns>一个动态对象的枚举器。</returns>
        public virtual IEnumerable <dynamic> ExecuteEnumerable(IQueryCommand queryCommand, IDataSegment segment = null, ParameterCollection parameters = null)
        {
            Guard.ArgumentNull(queryCommand, nameof(queryCommand));

            using var reader = ExecuteReader(queryCommand, segment, parameters, CommandBehavior.Default);
            var wrapper = Provider.GetService <IRecordWrapper>();

            TypeDescriptorUtility.AddDefaultDynamicProvider();

            while (reader.Read())
            {
                var expando    = new ExpandoObject();
                var dictionary = (IDictionary <string, object>)expando;

                for (int i = 0, n = reader.FieldCount; i < n; i++)
                {
                    var name = wrapper.GetFieldName(reader, i);
                    if (name.Equals("ROW_NUM"))
                    {
                        continue;
                    }

                    dictionary.Add(wrapper.GetFieldName(reader, i), RecordWrapHelper.GetValue(wrapper, reader, i));
                }

                yield return(expando);
            }
        }
Пример #6
0
        /// <summary>
        /// 执行查询文本,返回受影响的记录数。
        /// </summary>
        /// <param name="queryCommand">查询命令。</param>
        /// <param name="parameters">查询参数集合。</param>
        /// <returns>所影响的记录数。</returns>
        public virtual int ExecuteNonQuery(IQueryCommand queryCommand, ParameterCollection parameters = null)
        {
            Guard.ArgumentNull(queryCommand, nameof(queryCommand));
            return(UsingConnection(connection =>
            {
                using (var command = CreateDbCommand(connection, queryCommand, parameters))
                {
                    try
                    {
                        var result = HandleCommandExecute(command, () => command.ExecuteNonQuery());

                        command.SyncParameters(parameters);
                        command.ClearParameters();

                        return result;
                    }
                    catch (DbException exp)
                    {
                        HandleFailedLog(command, exp);

                        throw new CommandException(command, exp);
                    }
                }
            }, mode: DistributedMode.Master));
        }
Пример #7
0
        /// <summary>
        /// 异步的,执行查询文本并将结果并返回动态序列。
        /// </summary>
        /// <param name="queryCommand">查询命令。</param>
        /// <param name="segment">数据分段对象。</param>
        /// <param name="parameters">查询参数集合。</param>
        /// <param name="cancellationToken">取消操作的通知。</param>
        /// <returns>一个动态对象的枚举器。</returns>
        public virtual async Task <IEnumerable <dynamic> > ExecuteEnumerableAsync(IQueryCommand queryCommand, IDataSegment segment = null, ParameterCollection parameters = null, CancellationToken cancellationToken = default)
        {
            Guard.ArgumentNull(queryCommand, nameof(queryCommand));
            cancellationToken.ThrowIfCancellationRequested();

            var result = new List <dynamic>();

            using var reader = (InternalDataReader) await ExecuteReaderAsync(queryCommand, segment, parameters, CommandBehavior.Default, cancellationToken);

            var wrapper = Provider.GetService <IRecordWrapper>();

            TypeDescriptorUtility.AddDefaultDynamicProvider();

            while (await reader.ReadAsync(cancellationToken))
            {
                var expando    = new ExpandoObject();
                var dictionary = (IDictionary <string, object>)expando;

                for (int i = 0, n = reader.FieldCount; i < n; i++)
                {
                    var name = wrapper.GetFieldName(reader, i);
                    if (name.Equals("ROW_NUM"))
                    {
                        continue;
                    }

                    dictionary.Add(wrapper.GetFieldName(reader, i), RecordWrapHelper.GetValue(wrapper, reader, i));
                }

                result.Add(expando);
            }

            return(result);
        }
Пример #8
0
        /// <summary>
        /// Resets this enumerator preparing it for a fresh new execution.
        /// </summary>
        public void Reset()
        {
            try { if (_Enumerator != null)
                  {
                      _Enumerator.Dispose();
                  }
            }
            catch { }
            try { if (_CoreCommand != null)
                  {
                      _CoreCommand.Dispose();
                  }
            }
            catch { }

            if (_Indented)
            {
                DebugEx.Unindent();
            }
            _Indented = false;

            _Enumerator  = null;
            _CoreCommand = null;
            _Current     = null;
        }
Пример #9
0
        /// <summary>
        /// 执行查询文本并返回一个 <see cref="IDataReader"/>。
        /// </summary>
        /// <param name="queryCommand">查询命令。</param>
        /// <param name="segment">数据分段对象。</param>
        /// <param name="parameters">查询参数集合。</param>
        /// <returns>一个 <see cref="IDataReader"/> 对象。</returns>
        public virtual IDataReader ExecuteReader(IQueryCommand queryCommand, IDataSegment segment = null, ParameterCollection parameters = null)
        {
            Guard.ArgumentNull(queryCommand, nameof(queryCommand));
            return(UsingConnection(connection =>
            {
                var command = CreateDbCommand(connection, queryCommand, parameters);
                try
                {
                    var cmdBehavior = CommandBehavior.Default;
                    var context = new CommandContext(this, command, segment, parameters);
                    HandleSegmentCommand(context);

                    IDataReader result = HandleCommandExecute(command, () => command.ExecuteReader(cmdBehavior));

                    command.SyncParameters(parameters);
                    command.ClearParameters();

                    return result;
                }
                catch (DbException exp)
                {
                    HandleFailedLog(command, exp);

                    throw new CommandException(command, exp);
                }
            }, mode: DistributedMode.Slave));
        }
Пример #10
0
        /// <summary>
        /// 执行查询文本并返回一个 <see cref="IDataReader"/>。
        /// </summary>
        /// <param name="queryCommand">查询命令。</param>
        /// <param name="segment">数据分段对象。</param>
        /// <param name="parameters">查询参数集合。</param>
        /// <returns>一个 <see cref="IDataReader"/> 对象。</returns>
        public virtual IDataReader ExecuteReader(IQueryCommand queryCommand, IDataSegment segment = null, ParameterCollection parameters = null)
        {
            Guard.ArgumentNull(queryCommand, "queryCommand");
            return(UsingConnection(() =>
            {
                var command = CreateDbCommand(queryCommand, parameters);
                try
                {
                    var cmdBehavior = CommandBehavior.Default;
                    IDataReader reader = null;
                    var context = new CommandContext(this, command, segment, parameters);
                    OnCommandExecuted(command, segment, parameters, TimeWatcher.Watch(() => ProcessSegmentCommand(context, () => reader = command.ExecuteReader(cmdBehavior))));

                    command.SyncParameters(parameters);
                    command.ClearParameters();

                    return reader;
                }
                catch (DbException exp)
                {
                    TrackFailedLog(command, exp);

                    throw new CommandException(command, exp);
                }
            }));
        }
Пример #11
0
        /// <summary>
        /// 执行查询文本,返回受影响的记录数。
        /// </summary>
        /// <param name="queryCommand">查询命令。</param>
        /// <param name="parameters">查询参数集合。</param>
        /// <returns>所影响的记录数。</returns>
        public virtual int ExecuteNonQuery(IQueryCommand queryCommand, ParameterCollection parameters = null)
        {
            Guard.ArgumentNull(queryCommand, "queryCommand");
            return(UsingConnection(() =>
            {
                using (var command = CreateDbCommand(queryCommand, parameters))
                {
                    try
                    {
                        var result = 0;

                        OnCommandExecuted(command, null, parameters, TimeWatcher.Watch(() => result = command.ExecuteNonQuery()));
                        command.SyncParameters(parameters);
                        command.ClearParameters();
                        return result;
                    }
                    catch (DbException exp)
                    {
                        TrackFailedLog(command, exp);

                        throw new CommandException(command, exp);
                    }
                }
            }));
        }
Пример #12
0
        /// <summary>
        /// 执行查询文本并将结果填充到指定的 <see cref="DataTable"/> 对象中。
        /// </summary>
        /// <param name="queryCommand">查询命令。</param>
        /// <param name="tableName"><see cref="DataTable"/> 的名称。</param>
        /// <param name="segment">数据分段对象。</param>
        /// <param name="parameters">查询参数集合。</param>
        /// <returns>一个 <see cref="DataTable"/> 对象。</returns>
        public virtual DataTable ExecuteDataTable(IQueryCommand queryCommand, string tableName = null, IDataSegment segment = null, ParameterCollection parameters = null)
        {
            Guard.ArgumentNull(queryCommand, nameof(queryCommand));
            var ds = new DataSet();

            FillDataSet(ds, queryCommand, tableName, segment, parameters);
            return(ds.Tables.Count == 0 ? null : ds.Tables[0]);
        }
        public IEnumerable <TR> FindBy <TR>(IQueryCommand <TDomain> queryObject, Expression <Func <TDomain, TR> > projection)
        {
            var predicateTData = _replaceTypeVisitor.Convert <TDomain, TData, bool>(queryObject.Predicate);

            var projectionTData = _replaceTypeVisitor.Convert <TDomain, TData, TR>(projection);

            return(Set.Where(predicateTData).Select(projectionTData).ToList());
        }
Пример #14
0
        public void Xpto()
        {
            IDbConnection dbConnection = default(IDbConnection);

            List <Temp>   temps = dbConnection.Query <Temp>("", null).ToList();
            IQueryCommand comparisonOperators = dbConnection.Select().From("SeiLa").Where("x").EqualTo(1);
            //List<Temp> enumerable = comparisonOperators.Query<Temp>().ToList();
        }
Пример #15
0
 public static Task <T> QuerySingleOrDefaultAsync <T>(this IQueryCommand queryCommand, IDbTransaction transaction = null, int?commandTimeout = null, CommandType?commandType = null)
 {
     if (queryCommand is FlepperDapperQuery flepperDapperQuery)
     {
         return(flepperDapperQuery.QuerySingleOrDefaultAsync <T>(transaction, commandTimeout, commandType));
     }
     throw new NotSupportedException("Only instances of FlepperDapperQuery can execute this method.");
 }
Пример #16
0
 public static GridReader QueryMultiple(this IQueryCommand queryCommand, IDbTransaction transaction = null, int?commandTimeout = null, CommandType?commandType = null)
 {
     if (queryCommand is FlepperDapperQuery flepperDapperQuery)
     {
         return(flepperDapperQuery.QueryMultiple(transaction, commandTimeout, commandType));
     }
     throw new NotSupportedException("Only instances of FlepperDapperQuery can execute this method.");
 }
Пример #17
0
        //the API
        //...
        public IDataReader Execute(IQueryCommand cmd)
        {
            //build the command and execute it
            var dbCommand = cmd.BuildCommand();

            //...
            return(null);
        }
Пример #18
0
 public static object QueryFirstOrDefault(this IQueryCommand queryCommand, Type type, IDbTransaction transaction = null, int?commandTimeout = null, CommandType?commandType = null)
 {
     if (queryCommand is FlepperDapperQuery flepperDapperQuery)
     {
         return(flepperDapperQuery.QueryFirstOrDefault(type, transaction, commandTimeout, commandType));
     }
     throw new NotSupportedException("Only instances of FlepperDapperQuery can execute this method.");
 }
        public IMessageFormater CreateFormaterForCommand(IQueryCommand command)
        {
            if (command is WallCommand)
            {
                return new WallMessageFormater(new MessageFormater(new ElapsedTimeMessageFormater()));
            }

            return new MessageFormater(new ElapsedTimeMessageFormater());
        }
        public IMessageFormater CreateFormaterForCommand(IQueryCommand command)
        {
            if (command is WallCommand)
            {
                return(new WallMessageFormater(new MessageFormater(new ElapsedTimeMessageFormater())));
            }

            return(new MessageFormater(new ElapsedTimeMessageFormater()));
        }
Пример #21
0
 public static IEnumerable <T> Query <T>(this IQueryCommand queryCommand, IDbTransaction transaction = null, bool buffered = true,
                                         int?commandTimeout = null, CommandType?commandType = null)
 {
     if (queryCommand is FlepperDapperQuery flepperDapperQuery)
     {
         return(flepperDapperQuery.Query <T>(transaction, buffered, commandTimeout, commandType));
     }
     throw new NotSupportedException("Only instances of FlepperDapperQuery can execute this method.");
 }
Пример #22
0
 public static IEnumerable <TReturn> Query <TReturn>(this IQueryCommand queryCommand, Type[] types, Func <object[], TReturn> map, IDbTransaction transaction = null,
                                                     bool buffered = true, string splitOn = "Id", int?commandTimeout = null, CommandType?commandType = null)
 {
     if (queryCommand is FlepperDapperQuery flepperDapperQuery)
     {
         return(flepperDapperQuery.Query(types, map, transaction, buffered, splitOn, commandTimeout, commandType));
     }
     throw new NotSupportedException("Only instances of FlepperDapperQuery can execute this method.");
 }
Пример #23
0
        /// <summary>
        /// 执行查询文本,并返回第一行的第一列。
        /// </summary>
        /// <param name="queryCommand">查询命令。</param>
        /// <param name="parameters">查询参数集合。</param>
        /// <returns>第一行的第一列数据。</returns>
        public virtual T ExecuteScalar <T>(IQueryCommand queryCommand, ParameterCollection parameters = null)
        {
            var result = ExecuteScalar(queryCommand, parameters);

            if (result != DBNull.Value)
            {
                return(result.To <T>());
            }

            return(default);
Пример #24
0
        public TResult ExecuteQuery <TResult>(IQueryCommand <TResult> command)
        {
            var handler = dispatcher.GetHandler(command);

            if (handler == null)
            {
                throw new ArgumentNullException("handler");
            }
            return((TResult)handler.Query(command));
        }
 /// <summary>
 /// Sets the queryParameters into the mainQuery
 /// </summary>
 /// <param name="mainQuery">the mainQuery</param>
 /// <param name="subQueries">all the subQueries</param>
 public static void SetQueryParameters(IQueryCommand mainQuery, List <IQueryPart> subQueries)
 {
     foreach (IQueryPart subQuery in subQueries)
     {
         foreach (KeyValuePair <string, object> parameter in subQuery.Parameters)
         {
             mainQuery.AddParameter(parameter.Key, parameter.Value);
         }
     }
 }
Пример #26
0
 /// <summary>
 /// Initializes a new instance.
 /// </summary>
 /// <param name="map">The map this command will be associated with.</param>
 public DataQuery(DataMap <T> map)
     : base(map)
 {
     _Template = map.Link.Query();
     if (_Template == null)
     {
         throw new CannotCreateException(
                   "Cannot create a template query for this '{0}'.".FormatWith(this));
     }
 }
Пример #27
0
        /// <summary>
        /// 异步执行查询文本并将结果以一个 <see cref="IEnumerable{T}"/> 的序列返回。
        /// </summary>
        /// <typeparam name="T">查询对象类型。</typeparam>
        /// <param name="queryCommand">查询命令。</param>
        /// <param name="segment">数据分段对象。</param>
        /// <param name="parameters">查询参数集合。</param>
        /// <param name="rowMapper">数据行映射器。</param>
        /// <param name="cancellationToken">取消操作的通知。</param>
        /// <returns>一个 <typeparamref name="T"/> 类型的对象的枚举器。</returns>
        public async virtual Task <IEnumerable <T> > ExecuteEnumerableAsync <T>(IQueryCommand queryCommand, IDataSegment segment = null, ParameterCollection parameters = null, IDataRowMapper <T> rowMapper = null, CancellationToken cancellationToken = default)
        {
            Guard.ArgumentNull(queryCommand, nameof(queryCommand));

            rowMapper = rowMapper ?? RowMapperFactory.CreateRowMapper <T>();
            rowMapper.RecordWrapper = Provider.GetService <IRecordWrapper>();

            var reader = await ExecuteReaderAsync(queryCommand, segment, parameters, cancellationToken);

            return(new AsyncEnumerable <T>(this, reader, rowMapper));
        }
Пример #28
0
        /// <summary>
        /// 执行查询文本并将结果以一个 <see cref="IEnumerable{T}"/> 的序列返回。
        /// </summary>
        /// <typeparam name="T">查询对象类型。</typeparam>
        /// <param name="queryCommand">查询命令。</param>
        /// <param name="segment">数据分段对象。</param>
        /// <param name="parameters">查询参数集合。</param>
        /// <param name="rowMapper">数据行映射器。</param>
        /// <returns>一个 <typeparamref name="T"/> 类型的对象的枚举器。</returns>
        public virtual IEnumerable <T> ExecuteEnumerable <T>(IQueryCommand queryCommand, IDataSegment segment = null, ParameterCollection parameters = null, IDataRowMapper <T> rowMapper = null)
        {
            Guard.ArgumentNull(queryCommand, nameof(queryCommand));

            rowMapper ??= RowMapperFactory.CreateRowMapper <T>();
            rowMapper.RecordWrapper = Provider.GetService <IRecordWrapper>();
            using var reader        = ExecuteReader(queryCommand, segment, parameters, CommandBehavior.Default);
            while (reader.Read())
            {
                yield return(rowMapper.Map(this, reader));
            }
        }
Пример #29
0
        /// <summary>
        /// 异步执行查询文本并将结果以一个 <see cref="IEnumerable&lt;T&gt;"/> 的序列返回。
        /// </summary>
        /// <typeparam name="T">查询对象类型。</typeparam>
        /// <param name="queryCommand">查询命令。</param>
        /// <param name="segment">数据分段对象。</param>
        /// <param name="parameters">查询参数集合。</param>
        /// <param name="rowMapper">数据行映射器。</param>
        /// <returns>一个 <typeparamref name="T"/> 类型的对象的枚举器。</returns>
        public async virtual Task <IEnumerable <T> > ExecuteEnumerableAsync <T>(IQueryCommand queryCommand, IDataSegment segment = null, ParameterCollection parameters = null, IDataRowMapper <T> rowMapper = null)
        {
            Guard.ArgumentNull(queryCommand, "queryCommand");

            var reader = ExecuteReaderAsync(queryCommand, segment, parameters);

            return(await new Task <IEnumerable <T> >(() =>
            {
                var list = new List <T>();
                rowMapper = rowMapper ?? RowMapperFactory.CreateRowMapper <T>();
                rowMapper.RecordWrapper = Provider.GetService <IRecordWrapper>();
                return new List <T>(new AsyncEnumerable <T>(reader.Result, rowMapper));
            }));
        }
 public IQueryHandler GetHandler(IQueryCommand query)
 {
     var interfaces = query.GetType().GetInterfaces();
     foreach (var type in interfaces)
     {
         if (type.IsGenericType && typeof (IQueryCommand).IsAssignableFrom(type))
         {
             var handlerType = typeof (IQueryHandler<,>).MakeGenericType(query.GetType(),
                 type.GetGenericArguments()[0]);
             return (IQueryHandler) locator.GetInstance(handlerType);
         }
     }
     throw new InvalidOperationException("don't implement IQueryCommand directory, use IQueryCommand<T>");
 }
Пример #31
0
        /// <summary>
        /// 异步的,执行查询文本并将结果以一个 <see cref="IEnumerable{T}"/> 的序列返回。
        /// </summary>
        /// <typeparam name="T">查询对象类型。</typeparam>
        /// <param name="queryCommand">查询命令。</param>
        /// <param name="segment">数据分段对象。</param>
        /// <param name="parameters">查询参数集合。</param>
        /// <param name="rowMapper">数据行映射器。</param>
        /// <param name="cancellationToken">取消操作的通知。</param>
        /// <returns>一个 <typeparamref name="T"/> 类型的对象的枚举器。</returns>
        public async virtual IAsyncEnumerable <T> ExecuteEnumerableAsync <T>(IQueryCommand queryCommand, IDataSegment segment = null, ParameterCollection parameters = null, IDataRowMapper <T> rowMapper = null, CancellationToken cancellationToken = default)
        {
            Guard.ArgumentNull(queryCommand, nameof(queryCommand));

            rowMapper = rowMapper ?? RowMapperFactory.CreateRowMapper <T>();
            rowMapper.RecordWrapper = Provider.GetService <IRecordWrapper>();
            using (var reader = (DbDataReader)(await ExecuteReaderAsync(queryCommand, segment, parameters, cancellationToken)))
            {
                while (await reader.ReadAsync(cancellationToken))
                {
                    yield return(rowMapper.Map(this, reader));
                }
            }
        }
Пример #32
0
        /// <summary>
        /// 执行查询文本并将结果以一个 <see cref="IEnumerable&lt;T&gt;"/> 的序列返回。
        /// </summary>
        /// <typeparam name="T">查询对象类型。</typeparam>
        /// <param name="queryCommand">查询命令。</param>
        /// <param name="segment">数据分段对象。</param>
        /// <param name="parameters">查询参数集合。</param>
        /// <param name="rowMapper">数据行映射器。</param>
        /// <returns>一个 <typeparamref name="T"/> 类型的对象的枚举器。</returns>
        public virtual IEnumerable <T> ExecuteEnumerable <T>(IQueryCommand queryCommand, IDataSegment segment = null, ParameterCollection parameters = null, IDataRowMapper <T> rowMapper = null)
        {
            Guard.ArgumentNull(queryCommand, "queryCommand");

            rowMapper = rowMapper ?? RowMapperFactory.CreateRowMapper <T>();
            rowMapper.RecordWrapper = Provider.GetService <IRecordWrapper>();
            using (var reader = ExecuteReader(queryCommand, segment, parameters))
            {
                while (reader.Read())
                {
                    yield return(rowMapper.Map(reader));
                }
            }
        }
		public FakeCommandProvider(IDataLink link) { TheCommand = link.Query(); }
 public void AddQuery(IQueryCommand command)
 {
 }