예제 #1
0
        /// <summary>
        /// DataReader 정보를 <paramref name="persister"/>가 처리하여 대상 객체로 빌드합니다.
        /// </summary>
        /// <typeparam name="T">대상 객체의 수형</typeparam>
        /// <param name="reader">DataReader</param>
        /// <param name="persister">대상 객체를 빌드하는 Persister</param>
        /// <param name="firstResult">첫번째 레코드 인덱스 (0부터 시작합니다. null이면 0으로 간주)</param>
        /// <param name="maxResults">매핑할 최대 레코드 수 (0이면, IDataReader의 끝까지 매핑합니다)</param>
        /// <param name="additionalMapping">부가 매핑 작업을 수행하는 델리게이트</param>
        /// <returns>생성된 대상 객체의 컬렉션</returns>
        public static IList <T> Map <T>(this IDataReader reader,
                                        IReaderPersister <T> persister,
                                        int firstResult,
                                        int maxResults,
                                        Action <IDataReader, T> additionalMapping)
        {
            reader.ShouldNotBeNull("reader");
            persister.ShouldNotBeNull("persister");
            Guard.Assert(reader.IsClosed == false, "IDataReader가 이미 닫혀있습니다.");

            if (IsDebugEnabled)
            {
                log.Debug("Persister를 이용하여 DataReader로부터 [{0}] 수형의 객체를 생성합니다. firstResult=[{1}], maxResults=[{2}]",
                          typeof(T).FullName, firstResult, maxResults);
            }

            var targets = new List <T>();

            // 첫 번째 인덱스 전에 것들은 Skip 해버립니다.
            //
            while (firstResult-- > 0)
            {
                if (reader.Read() == false)
                {
                    return(targets);
                }
            }

            if (maxResults <= 0)
            {
                maxResults = Int32.MaxValue;
            }

            var instanceCount = 0;

            while (reader.Read() && (instanceCount < maxResults))
            {
                var target = persister.Persist(reader);

                if (additionalMapping != null)
                {
                    additionalMapping(reader, target);
                }

                targets.Add(target);

                instanceCount++;
            }

            if (IsDebugEnabled)
            {
                log.Debug("Persister를 이용하여 DataReader로부터 [{0}] 수형의 객체 [{1}]개를 매핑했습니다.", typeof(T).FullName, targets.Count);
            }

            return(targets);
        }
        /// <summary>
        /// <see cref="IAdoRepository.ExecuteInstance{T}(System.Func{System.Data.IDataReader,T},System.Data.Common.DbCommand,NFramework.Data.IAdoParameter[])"/> 를 비동기적으로 수행하여,
        /// DataReader로부터 <paramref name="filter"/> 에 만족하는 레코드만 T 수형의 인스턴스를 매핑한다.
        /// </summary>
        /// <typeparam name="T">결과 셋으로 표현할 엔티티의 수형</typeparam>
        /// <param name="repository"><see cref="IAdoRepository"/></param>
        /// <param name="persister">대상 객체를 빌드하는 Persister</param>
        /// <param name="filter">매핑할 Row를 선별할 필터 함수</param>
        /// <param name="query">실행할 SQL문 또는 Procedure Name</param>
        /// <param name="parameters">패러미터</param>
        /// <returns>매핑한 엔티티 컬렉션을 결과값으로 가지는 Task</returns>
        public static Task <IEnumerable <T> > ExecuteInstanceIfAsync <T>(this IAdoRepository repository,
                                                                         IReaderPersister <T> persister,
                                                                         Func <IDataReader, bool> filter,
                                                                         string query,
                                                                         params IAdoParameter[] parameters) where T : class
        {
            persister.ShouldNotBeNull("persister");
            filter.ShouldNotBeNull("filter");

            return(Task.Factory.StartNew(() => {
                using (var reader = repository.ExecuteReader(query, parameters))
                    return reader.MapIf <T>(persister, filter, null);
            }));
        }
예제 #3
0
        /// <summary>
        /// Execute DbCommand, Build instance of specified type from IDataReader using Persister
        /// </summary>
        /// <typeparam name="T">Type of persistent object</typeparam>
        /// <param name="repository">IAdoRepository 인스턴스</param>
        /// <param name="persister">Persister from IDataReader</param>
        /// <param name="cmd">Instance of DbCommand</param>
        /// <param name="parameters">Parameters for DbCommand to execute</param>
        /// <returns>List of Persistent Object</returns>
        public static IList <T> ExecuteInstance <T>(this IAdoRepository repository,
                                                    IReaderPersister <T> persister,
                                                    DbCommand cmd,
                                                    params IAdoParameter[] parameters) where T : class
        {
            persister.ShouldNotBeNull("persister");
            cmd.ShouldNotBeNull("cmd");

            if (IsDebugEnabled)
            {
                log.Debug("DataReader를 IReaderPersister를 통해 지정된 Class의 인스턴스들을 생성합니다. " +
                          "persistent=[{0}], persister=[{1}], commandText=[{2}], parameters=[{3}]",
                          typeof(T).FullName, persister, cmd.CommandText, parameters.CollectionToString());
            }

            using (var reader = repository.ExecuteReader(cmd, parameters))
                return(reader.Map <T>(persister));
        }
예제 #4
0
        /// <summary>
        /// <see cref="ExecuteInstance{T}(IAdoRepository,NFramework.Data.Persisters.IReaderPersister{T},System.Data.Common.DbCommand,NFramework.Data.IAdoParameter[])"/> 를 비동기적으로 수행하여,
        /// DataReader로부터 T 수형의 인스턴스를 매핑한다.
        /// </summary>
        /// <typeparam name="T">결과 셋으로 표현할 엔티티의 수형</typeparam>
        /// <param name="repository"><see cref="IAdoRepository"/></param>
        /// <param name="persister">DataReader로부터 {T} 수형의 인스턴스를 생성하는 생성자</param>
        /// <param name="query">실행할 SQL문 또는 Procedure Name</param>
        /// <param name="parameters">패러미터</param>
        /// <returns>매핑한 엔티티 컬렉션을 결과값으로 가지는 Task</returns>
        public static Task <IList <T> > ExecuteInstanceAsync <T>(this IAdoRepository repository,
                                                                 IReaderPersister <T> persister,
                                                                 string query,
                                                                 params IAdoParameter[] parameters) where T : class
        {
            persister.ShouldNotBeNull("persister");
            query.ShouldNotBeWhiteSpace("query");

            if (IsDebugEnabled)
            {
                log.Debug("비동기적으로 ExecuteReader<{0}>()을 수행하고, 결과를 IList<{0}>으로 매핑합니다... query=[{1}]", typeof(T).FullName, query);
            }

            return(Task.Factory.StartNew(() => {
                using (var cmd = repository.GetCommand(query))
                    return repository.ExecuteInstance <T>(persister,
                                                          cmd,
                                                          parameters);
            }));
        }
예제 #5
0
        /// <summary>
        /// DataReader 정보를 <paramref name="persister"/>가 처리하여 대상 객체로 빌드합니다.
        /// </summary>
        /// <typeparam name="T">대상 객체의 수형</typeparam>
        /// <param name="reader">DataReader</param>
        /// <param name="persister">대상 객체를 빌드하는 Persister</param>
        /// <param name="rowFilter">매핑할 Row를 선별할 필터 함수</param>
        /// <param name="additionalMapping">부가 매핑 작업을 수행하는 델리게이트</param>
        /// <returns>생성된 대상 객체의 컬렉션</returns>
        public static IEnumerable <T> MapIf <T>(this IDataReader reader,
                                                IReaderPersister <T> persister,
                                                Func <IDataReader, bool> rowFilter,
                                                Action <IDataReader, T> additionalMapping = null)
        {
            persister.ShouldNotBeNull("persister");

            Func <IDataReader, T> @readerMapFunc =
                dr => {
                var target = persister.Persist(reader);

                if (additionalMapping != null)
                {
                    additionalMapping(dr, target);
                }

                return(target);
            };

            return(MapIf(reader, readerMapFunc, rowFilter));
        }