コード例 #1
0
        /// <summary>
        /// IDataReader 정보를 <paramref name="rowMapFunc"/>가 병렬 방식으로 처리하여 대상 객체로 빌드합니다.
        /// </summary>
        /// <typeparam name="T">대상 객체의 수형</typeparam>
        /// <param name="reader">DataReader</param>
        /// <param name="rowMapFunc">대상 객체를 빌드하는 함수</param>
        /// <param name="firstResult">첫번째 레코드 인덱스 (0부터 시작합니다. null이면 0으로 간주)</param>
        /// <param name="maxResults">매핑할 최대 레코드 수 (0이면, IDataReader의 끝까지 매핑합니다)</param>
        /// <returns>매핑된 대상 객체의 컬렉션</returns>
        public static IList <T> MapAsParallel <T>(this IDataReader reader, Func <AdoResultRow, T> rowMapFunc, int firstResult = 0,
                                                  int maxResults = 0)
        {
            reader.ShouldNotBeNull("reader");
            rowMapFunc.ShouldNotBeNull("rowMapFunc");

            Guard.Assert(reader.IsClosed == false, "IDataReader가 이미 닫혀있습니다!!!");

            if (IsDebugEnabled)
            {
                log.Debug("IDataReader를 읽어 수형[{0}]으로 매핑하여, 컬렉션으로 반환합니다...", typeof(T).Name);
            }

            var resultSet = new AdoResultSet(reader, firstResult, maxResults);

            if (resultSet.Count == 0)
            {
                return(new List <T>());
            }

            return
                (resultSet.Values
                 .AsParallel()
                 .AsOrdered()
                 .Select(rowMapFunc)
                 .ToList());
        }
コード例 #2
0
        /// <summary>
        /// IDataReader 정보를 병렬 방식으로 매핑을 수행하여, 컬렉션을 반환합니다.
        /// </summary>
        /// <typeparam name="T">매핑 대상 수형</typeparam>
        /// <param name="reader">DataReader</param>
        /// <param name="nameMap">컬럼명-속성명 매핑 정보</param>
        /// <param name="targetFactory">대상 수형 Factory 함수</param>
        /// <param name="firstResult">첫번째 레코드 인덱스 (0부터 시작합니다. null이면 0으로 간주)</param>
        /// <param name="maxResults">매핑할 최대 레코드 수 (0이면, IDataReader의 끝까지 매핑합니다)</param>
        /// <param name="additionalMapping">추가 매핑 작업을 수행할 델리게이트</param>
        /// <returns>매핑된 객체의 컬렉션</returns>
        public static IList <T> MapAsParallel <T>(this IDataReader reader,
                                                  Func <T> targetFactory,
                                                  INameMap nameMap,
                                                  int firstResult = 0,
                                                  int maxResults  = 0,
                                                  Action <AdoResultRow, T> additionalMapping = null)
        {
            reader.ShouldNotBeNull("reader");
            nameMap.ShouldNotBeNull("nameMap");
            targetFactory.ShouldNotBeNull("targetFactory");

            Guard.Assert(reader.IsClosed == false, "IDataReader가 이미 닫혀있습니다!!!");

            if (IsDebugEnabled)
            {
                log.Debug("IDataReader를 읽어 수형[{0}]으로 병렬로 매핑하여, 컬렉션으로 반환합니다...", typeof(T).Name);
            }

            if (nameMap.Count == 0)
            {
                return(new List <T>());
            }

            var resultSet = new AdoResultSet(reader, firstResult, maxResults);

            if (resultSet.Count == 0)
            {
                return(new List <T>());
            }

            var targetAccessor = GetDynamicAccessor <T>();
            var fieldNames     = resultSet.FieldNames.Where(n => nameMap.ContainsKey(n)).ToArray();

            return
                (resultSet.Values
                 .AsParallel()
                 .AsOrdered()
                 .Select(row => {
                var target = targetFactory();

                fieldNames.RunEach(fn => targetAccessor.SetPropertyValue(target, nameMap[fn], row[fn]));

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

                return target;
            })
                 .ToList());
        }
コード例 #3
0
        /// <summary>
        /// <paramref name="reader"/>의 레코드 정보를 <paramref name="rowMapFunc"/>를 통해 매핑을 병렬 방식으로 수행하는데, 계속조건 (<paramref name="continuationCondition"/>) 이 만족할때까지만 수행한다.
        /// </summary>
        /// <typeparam name="T">대상 객체</typeparam>
        /// <param name="reader">IDataReader 객체</param>
        /// <param name="rowMapFunc">매핑 함수</param>
        /// <param name="continuationCondition">진행 조건 (False가 나올 때까지 진행합니다)</param>
        /// <returns>대상 객체 컬렉션</returns>
        public static IList <T> MapWhileAsParallel <T>(this IDataReader reader, Func <AdoResultRow, T> rowMapFunc,
                                                       Func <AdoResultRow, bool> continuationCondition)
        {
            reader.ShouldNotBeNull("reader");
            rowMapFunc.ShouldNotBeNull("rowMapFunc");
            continuationCondition.ShouldNotBeNull("rowMapFunc");

            Guard.Assert(reader.IsClosed == false, "IDataReader가 이미 닫혀있습니다!!!");

            var resultSet = new AdoResultSet(reader);

            if (resultSet.Count == 0)
            {
                return(new List <T>());
            }

            return
                (resultSet.Values
                 .AsParallel()
                 .AsOrdered()
                 .TakeWhile(continuationCondition)
                 .Select(rowMapFunc)
                 .ToList());
        }