/// <summary>
        /// 비동기적으로 ExecuteReader()을 수행하고, 병렬 방식으로 매핑하여 결과를 IPageList{T} 으로 반환하는 Task를 빌드합니다
        /// </summary>
        /// <typeparam name="T">결과 셋으로 표현할 엔티티의 수형</typeparam>
        /// <param name="repository"><see cref="IAdoRepository"/></param>
        /// <param name="rowMapFunc">DataReader로부터 {T} 수형의 인스턴스로 변환하는 메소드</param>
        /// <param name="query">실행할 SQL문 또는 Procedure Name</param>
        /// <param name="pageIndex">결과셋의 Page Index (0부터 시작)</param>
        /// <param name="pageSize">결과셋 Paging 시의 Page Size</param>
        /// <param name="parameters">패러미터</param>
        /// <returns>매핑한 엔티티 컬렉션을 결과값으로 가지는 Task</returns>
        public static Task <IPagingList <T> > ExecuteInstanceAsParallelAsync <T>(this IAdoRepository repository,
                                                                                 Func <AdoResultRow, T> rowMapFunc,
                                                                                 string query,
                                                                                 int pageIndex,
                                                                                 int pageSize,
                                                                                 params IAdoParameter[] parameters)
        {
            rowMapFunc.ShouldNotBeNull("converter");
            query.ShouldNotBeWhiteSpace("query");

            if (IsDebugEnabled)
            {
                log.Debug("비동기적으로 ExecuteReader()을 수행하고, 병렬 방식으로 매핑하여 결과를 IPageList<{0}>으로 반환하는 Task를 빌드합니다... " +
                          @"query=[{1}]", typeof(T).Name, query);
            }

            var itemsTask = Task.Factory.StartNew(() => {
                using (var reader = repository.ExecuteReader(query, parameters))
                    return(reader.MapAsParallel <T>(rowMapFunc, pageIndex * pageSize, pageSize));
            });

            var totalItemCountTask = repository.CountAsync(query, parameters);

            var result = new PagingList <T>(itemsTask.Result, pageIndex, pageSize, totalItemCountTask.Result);

            return(Task.Factory.FromResult((IPagingList <T>)result));
        }
コード例 #2
0
        /// <summary>
        /// 지정된 Command를 실행하여, 결과 셋을 Paging하여, 지정된 Page에 해당하는 정보만 Persistent Object로 빌드하여 반환한다.
        /// </summary>
        /// <typeparam name="T">Persistent Object의 수형</typeparam>
        /// <param name="repository">IAdoRepository 인스턴스</param>
        /// <param name="mapFunc">IDataReader로부터 Persistent Object를 빌드하는 Mapping function</param>
        /// <param name="cmd">실행할 DbCommand</param>
        /// <param name="pageIndex">결과셋의 Page Index (0부터 시작)</param>
        /// <param name="pageSize">결과셋 Paging 시의 Page Size</param>
        /// <param name="parameters">DbCommand 실행시의 Parameter 정보</param>
        /// <returns>Paging된 Persistent Object의 List</returns>
        public static IPagingList <T> ExecuteInstance <T>(this IAdoRepository repository,
                                                          Func <IDataReader, T> @mapFunc,
                                                          DbCommand cmd,
                                                          int pageIndex,
                                                          int pageSize,
                                                          params IAdoParameter[] parameters)
        {
            @mapFunc.ShouldNotBeNull("@mapFunc");
            cmd.ShouldNotBeNull("cmd");

            pageIndex.ShouldBePositiveOrZero("pageIndex");
            pageSize.ShouldBePositive("pageSize");

            if (IsDebugEnabled)
            {
                log.Debug("ExecuteReader를 수행해 엔티티로 매핑합니다... " +
                          "CommandText=[{0}], @mapFunc=[{1}], pageIndex=[{2}], pageSize=[{3}], parameters=[{4}]",
                          cmd.CommandText, @mapFunc, pageIndex, pageSize, parameters.CollectionToString());
            }


            var query       = cmd.CommandText;
            var firstResult = pageIndex * pageSize;
            var maxResults  = pageSize;

            var totalItemCountTask = repository.CountAsync(query, parameters);

            IList <T> instances;

            using (var dr = repository.ExecuteReader(cmd, parameters))
                instances = dr.Map <T>(@mapFunc, firstResult, maxResults);

            var pagingList = new PagingList <T>(instances, pageIndex, pageSize, totalItemCountTask.Result);

            if (IsDebugEnabled)
            {
                log.Debug("ExecuteReader를 수행해 엔티티로 매핑했습니다!!! pageIndex=[{0}], pageSize=[{1}], totalItemCount=[{2}]",
                          pageIndex, pageSize, totalItemCountTask.Result);
            }

            return(pagingList);
        }
コード例 #3
0
        /// <summary>
        /// 지정된 Command를 실행하여, 결과 셋을 Paging하여, 지정된 Page에 해당하는 정보만 Persistent Object로 빌드하여 반환한다.
        /// </summary>
        /// <typeparam name="T">Persistent Object의 수형</typeparam>
        /// <param name="repository">IAdoRepository 인스턴스</param>
        /// <param name="nameMap">컬럼명:속성명의 매핑정보</param>
        /// <param name="additionalMapping">추가적인 매핑 함수</param>
        /// <param name="cmd">실행할 DbCommand</param>
        /// <param name="pageIndex">결과셋의 Page Index (0부터 시작)</param>
        /// <param name="pageSize">결과셋 Paging 시의 Page Size</param>
        /// <param name="parameters">DbCommand 실행시의 Parameter 정보</param>
        /// <returns>Paging된 Persistent Object의 List</returns>
        public static IPagingList <T> ExecuteInstance <T>(this IAdoRepository repository,
                                                          INameMap nameMap,
                                                          Action <IDataReader, T> additionalMapping,
                                                          DbCommand cmd,
                                                          int pageIndex,
                                                          int pageSize,
                                                          params IAdoParameter[] parameters) where T : class
        {
            nameMap.ShouldNotBeNull("nameMap");
            cmd.ShouldNotBeNull("cmd");

            if (IsDebugEnabled)
            {
                log.Debug("ExecuteReader를 수행해 PersistentObject로 매핑합니다... " +
                          "CommandText=[{0}], NameMapping=[{1}], pageIndex=[{2}], pageSize=[{3}], parameters=[{4}]",
                          cmd.CommandText, nameMap, pageIndex, pageSize, parameters.CollectionToString());
            }


            var query       = cmd.CommandText;
            var firstResult = pageIndex * pageSize;
            var maxResults  = pageSize;

            var totalItemCountTask = repository.CountAsync(query, parameters);

            IList <T> instances;

            using (var dr = repository.ExecuteReader(cmd, parameters))
                instances = dr.Map <T>(ActivatorTool.CreateInstance <T>, nameMap, firstResult, maxResults, additionalMapping);


            var pagingList = new PagingList <T>(instances, pageIndex, pageSize, totalItemCountTask.Result);

            if (IsDebugEnabled)
            {
                log.Debug("ExecuteReader를 수행해 PersistentObject로 매핑했습니다!!! pageIndex=[{0}], pageSize=[{1}], totalItemCount=[{2}]",
                          pageIndex, pageSize, totalItemCountTask.Result);
            }

            return(pagingList);
        }