/// <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)); }
/// <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); }
/// <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); }