/// <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 Task <IList <T> > ExecuteInstanceAsync <T>(this IAdoRepository repository, IReaderPersister <T> persister, DbCommand cmd, params IAdoParameter[] parameters) where T : class { return(Task.Factory.StartNew(() => repository.ExecuteInstance <T>(persister, cmd, parameters))); }
/// <summary> /// 지정된 Command를 실행하여, 결과 셋을 Paging하여, 지정된 Page에 해당하는 정보만 Persistent Object로 빌드하여 반환한다. /// </summary> /// <typeparam name="T">Persistent Object의 수형</typeparam> /// <param name="repository">IAdoRepository 인스턴스</param> /// <param name="persister">IDataReader로부터 Persistent Object를 빌드하는 Persister</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, IReaderPersister <T> persister, DbCommand cmd, int pageIndex, int pageSize, params IAdoParameter[] parameters) { return(repository.ExecuteInstance <T>(persister.Persist, cmd, pageIndex, pageSize, parameters)); }
/// <summary> /// 지정된 Command를 실행하여, 결과 셋을 Paging하여, 지정된 Page에 해당하는 정보만 Persistent Object로 빌드하여 반환한다. /// </summary> /// <typeparam name="T">Persistent Object의 수형</typeparam> /// <param name="repository">IAdoRepository 인스턴스</param> /// <param name="persister">IDataReader로부터 Persistent Object를 빌드하는 Persister</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 Task <IPagingList <T> > ExecuteInstanceAsync <T>(this IAdoRepository repository, IReaderPersister <T> persister, DbCommand cmd, int pageIndex, int pageSize, params IAdoParameter[] parameters) { return(Task.Factory.StartNew(() => repository.ExecuteInstance <T>(persister, cmd, pageIndex, pageSize, parameters))); }
/// <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); })); }
/// <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)); }
/// <summary> /// <paramref name="reader"/>의 레코드 정보를 <paramref name="persister"/>를 통해 매핑을 수행하는데, 계속조건 (<paramref name="continuationCondition"/>) 이 만족할때까지만 수행한다. /// </summary> /// <typeparam name="T">대상 객체</typeparam> /// <param name="reader">IDataReader 객체</param> /// <param name="persister">대상 객체를 빌드하는 Persister</param> /// <param name="continuationCondition">진행 조건 (False가 나올 때까지 진행합니다)</param> /// <param name="additionalMapping">컬럼-속성 단순 값 매핑 이외에 부가적인 매핑을 수행하기 위해 제공되는 델리게이트</param> /// <returns>매핑된 대상 객체 컬렉션</returns> public static IEnumerable <T> MapWhile <T>(this IDataReader reader, IReaderPersister <T> persister, Func <IDataReader, bool> continuationCondition, Action <IDataReader, T> additionalMapping = null) { Func <IDataReader, T> @readerMapFunc = dr => { var target = persister.Persist(reader); if (additionalMapping != null) { additionalMapping(dr, target); } return(target); }; return(MapWhile(reader, readerMapFunc, continuationCondition)); }
/// <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); })); }
/// <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)); }
/// <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> /// <returns>생성된 대상 객체의 컬렉션</returns> public static IList <T> Map <T>(this IDataReader reader, IReaderPersister <T> persister, int firstResult, int maxResults) { return(Map(reader, persister, firstResult, maxResults, (Action <IDataReader, T>)null)); }
/// <summary> /// DataReader 정보를 <paramref name="persister"/>가 처리하여 대상 객체로 빌드합니다. /// </summary> /// <typeparam name="T">대상 객체의 수형</typeparam> /// <param name="reader">DataReader</param> /// <param name="persister">대상 객체를 빌드하는 Persister</param> /// <param name="additinalMapping">부가 매핑 작업을 수행하는 델리게이트</param> /// <returns>생성된 대상 객체의 컬렉션</returns> public static IList <T> Map <T>(this IDataReader reader, IReaderPersister <T> persister, Action <IDataReader, T> additinalMapping) { return(Map(reader, persister, 0, 0, additinalMapping)); }
/// <summary> /// DataReader 정보를 <paramref name="persister"/>가 처리하여 대상 객체로 빌드합니다. /// </summary> /// <typeparam name="T">대상 객체의 수형</typeparam> /// <param name="reader">DataReader</param> /// <param name="persister">대상 객체를 빌드하는 Persister</param> /// <returns>생성된 대상 객체의 컬렉션</returns> public static IList <T> Map <T>(this IDataReader reader, IReaderPersister <T> persister) { return(Map(reader, persister, 0, 0, (Action <IDataReader, T>)null)); }