public void User_MapEntitiesAsParallel_SkipAlreadyExistValue_IgnoreCase()
        {
            UnitOfWork.CurrentSessionFactory.Evict(typeof(Company));
            UnitOfWork.CurrentSessionFactory.Evict(typeof(User));
            UnitOfWork.CurrentSession.Clear();

            var mapOptions = new MapPropertyOptions {
                SuppressException = true, SkipAlreadyExistValue = true, IgnoreCase = true
            };

            var users = Repository <User> .Query().ToList();

            var mappedUsers = users.MapEntitiesAsParallel(() => new UserDto {
                Password = "******"
            },
                                                          mapOptions,
                                                          (user, userDto) => { userDto.CompanyCode = user.Company.Code; },
                                                          p => p.Data);

            Assert.AreEqual(users.Count, mappedUsers.Count);

            for (var i = 0; i < users.Count; i++)
            {
                Assert.AreEqual(users[i].Name, mappedUsers[i].Name, "mapping Name is fail. index=" + i);
                Assert.AreNotEqual(users[i].Password, mappedUsers[i].Password, "mapping Password is fail. index=" + i);
                Assert.AreNotEqual(users[i].Data, mappedUsers[i].Data);
            }
        }
 /// <summary>
 /// 원본 객체를 대상 객체로 매핑합니다.
 /// </summary>
 /// <typeparam name="TSource">원본 객체 형식</typeparam>
 /// <typeparam name="TTarget">대상 객체 형식</typeparam>
 /// <param name="source">원본 객체</param>
 /// <param name="targetFactory">대상 객체 생성 Factory</param>
 /// <param name="mapOptions">매핑 옵션</param>
 /// <param name="propertyExprsToExclude">매핑에서 제외할 속성 표현식</param>
 /// <returns>대상 객체</returns>
 public static TTarget MapEntity <TSource, TTarget>(this TSource source,
                                                    Func <TTarget> targetFactory,
                                                    MapPropertyOptions mapOptions,
                                                    params Expression <Func <TTarget, object> >[] propertyExprsToExclude)
 {
     return(MapEntity <TSource, TTarget>(source, targetFactory, mapOptions, (Action <TSource, TTarget>)null, propertyExprsToExclude));
 }
 /// <summary>
 /// 원본 객체를 대상 객체로 매핑합니다.
 /// </summary>
 /// <typeparam name="TSource">원본 객체 형식</typeparam>
 /// <typeparam name="TTarget">대상 객체 형식</typeparam>
 /// <param name="sources">원본 객체 시퀀스</param>
 /// <param name="targetFactory">대상 객체 생성 Factory</param>
 /// <param name="mapOptions">매핑 옵션</param>
 /// <param name="propertyExprsToExclude">매핑에서 제외할 속성 표현식</param>
 /// <returns>대상 객체 시퀀스</returns>
 public static IList <TTarget> MapEntitiesAsParallel <TSource, TTarget>(this IList <TSource> sources,
                                                                        Func <TTarget> targetFactory,
                                                                        MapPropertyOptions mapOptions,
                                                                        params Expression <Func <TTarget, object> >[]
                                                                        propertyExprsToExclude)
 {
     return(MapEntitiesAsParallel(sources, targetFactory, mapOptions, (Action <TSource, TTarget>)null, propertyExprsToExclude));
 }
        /// <summary>
        /// 원본 객체를 대상 객체로 매핑합니다. <paramref name="additionalMapping"/>을 통해 추가적인 매핑을 수행할 수 있습니다.
        /// </summary>
        /// <typeparam name="TSource">원본 객체 형식</typeparam>
        /// <typeparam name="TTarget">대상 객체 형식</typeparam>
        /// <param name="source">원본 객체</param>
        /// <param name="targetFactory">대상 객체 생성 Factory</param>
        /// <param name="mapOptions">매핑 옵션</param>
        /// <param name="additionalMapping">추가 매핑 함수</param>
        /// <param name="propertyExprsToExclude">매핑에서 제외할 속성 표현식</param>
        /// <returns>대상 객체 시퀀스</returns>
        public static TTarget MapEntity <TSource, TTarget>(this TSource source,
                                                           Func <TTarget> targetFactory,
                                                           MapPropertyOptions mapOptions,
                                                           Action <TSource, TTarget> additionalMapping,
                                                           params Expression <Func <TTarget, object> >[] propertyExprsToExclude)
        {
            targetFactory.ShouldNotBeNull("targetFactory");

            var propertyNamesToExclude =
                propertyExprsToExclude.Select(expr => ExpressionProcessor.FindMemberExpression(expr.Body)).ToList();

            ExcludeStatePropertyForStateEntity <TSource>(propertyNamesToExclude);

            return(ObjectMapper.MapObject <TSource, TTarget>(source, targetFactory, mapOptions, additionalMapping,
                                                             propertyNamesToExclude.ToArray()));
        }
        /// <summary>
        /// 원본 객체를 대상 객체로 매핑합니다. <paramref name="additionalMapping"/>을 통해 추가적인 매핑을 수행할 수 있습니다.
        /// </summary>
        /// <typeparam name="TSource">원본 객체 형식</typeparam>
        /// <typeparam name="TTarget">대상 객체 형식</typeparam>
        /// <param name="sources">원본 객체 시퀀스</param>
        /// <param name="targetFactory">대상 객체 생성 Factory</param>
        /// <param name="mapOptions">매핑 옵션</param>
        /// <param name="additionalMapping">추가 매핑 함수</param>
        /// <param name="propertyExprsToExclude">매핑에서 제외할 속성 표현식</param>
        /// <returns>대상 객체 시퀀스</returns>
        public static IList <TTarget> MapEntitiesAsParallel <TSource, TTarget>(this IList <TSource> sources,
                                                                               Func <TTarget> targetFactory,
                                                                               MapPropertyOptions mapOptions,
                                                                               Action <TSource, TTarget> additionalMapping,
                                                                               params Expression <Func <TTarget, object> >[]
                                                                               propertyExprsToExclude)
        {
            if (IsDebugEnabled)
            {
                log.Debug("원본 엔티티[{0}] 컬렉션으로부터 대상 엔티티[{1}] 컬렉션으로 매핑을 수행합니다...",
                          typeof(TSource).Name, typeof(TTarget).Name);
            }

            targetFactory.ShouldNotBeNull("targetFactory");

            if (sources.Count == 0)
            {
                return(new List <TTarget>());
            }

            var propertyNamesToExclude =
                propertyExprsToExclude.Select(expr => ExpressionProcessor.FindMemberExpression(expr.Body)).ToList();

            ExcludeStatePropertyForStateEntity <TSource>(propertyNamesToExclude);

            // Source가 NHibernate 엔티티라면, Initialize를 통해, Lazy된 Proxy 값을 실제값으로 빌드합니다.
            //
            IList <TSource> initializedSources = sources;

            if (typeof(TSource).HasInterface(typeof(IStateEntity)))
            {
                if (IsDebugEnabled)
                {
                    log.Debug("원본 객체가 NHibernate Entity이므로, Initialize를 수행합니다...");
                }

                initializedSources = NHTool.InitializeEntities(sources, sources[0].IsDynamicProxy());
            }

            return
                (ObjectMapper
                 .MapObjectsAsParallel(initializedSources, targetFactory, mapOptions, additionalMapping,
                                       propertyNamesToExclude.ToArray())
                 .ToList());
        }
        /// <summary>
        /// 원본 객체를 대상 객체로 매핑합니다. <paramref name="additionalMapping"/>을 통해 추가적인 매핑을 수행할 수 있습니다.
        /// </summary>
        /// <typeparam name="TSource">원본 객체 형식</typeparam>
        /// <typeparam name="TTarget">대상 객체 형식</typeparam>
        /// <param name="sources">원본 객체 시퀀스</param>
        /// <param name="targetFactory">대상 객체 생성 Factory</param>
        /// <param name="mapOptions">매핑 옵션</param>
        /// <param name="additionalMapping">추가 매핑 함수</param>
        /// <param name="propertyExprsToExclude">매핑에서 제외할 속성 표현식</param>
        /// <returns>대상 객체 시퀀스</returns>
        public static IEnumerable <TTarget> MapEntities <TSource, TTarget>(this IEnumerable <TSource> sources,
                                                                           Func <TTarget> targetFactory,
                                                                           MapPropertyOptions mapOptions,
                                                                           Action <TSource, TTarget> additionalMapping,
                                                                           params Expression <Func <TTarget, object> >[]
                                                                           propertyExprsToExclude)
        {
            if (IsDebugEnabled)
            {
                log.Debug("원본 엔티티[{0}] 컬렉션으로부터 대상 엔티티[{1}] 컬렉션으로 매핑을 수행합니다...",
                          typeof(TSource).Name, typeof(TTarget).Name);
            }

            targetFactory.ShouldNotBeNull("targetFactory");

            var propertyNamesToExclude =
                propertyExprsToExclude.Select(expr => ExpressionProcessor.FindMemberExpression(expr.Body)).ToList();

            ExcludeStatePropertyForStateEntity <TSource>(propertyNamesToExclude);

            return(ObjectMapper.MapObjects(sources, targetFactory, mapOptions, additionalMapping, propertyNamesToExclude.ToArray()));
        }
Exemple #7
0
 /// <summary>
 /// 지정된 수형의 속성, 필드를 동적으로 접근할 수 있도록 해주는 <see cref="IDynamicAccessor"/>를 생성합니다.
 /// </summary>
 /// <param name="type">대상 수형</param>
 /// <param name="mapOptions">매핑 옵션</param>
 internal static IDynamicAccessor GetDynamicAccessor(Type type, MapPropertyOptions mapOptions = null)
 {
     return(DynamicAccessorFactory.CreateDynamicAccessor(type, mapOptions ?? MapPropertyOptions.Safety));
 }
Exemple #8
0
 /// <summary>
 /// 수형 {T} 의 인스턴스의 속성 및 필드에 동적으로 접근할 수 있도록 해주는 <see cref="IDynamicAccessor{T}"/>를 생성합니다.
 /// </summary>
 /// <typeparam name="T">대상 수형</typeparam>
 /// <param name="mapOptions">매핑 옵션</param>
 /// <seealso cref="TypeConvertableDynamicAccessor{T}"/>
 internal static IDynamicAccessor <T> GetDynamicAccessor <T>(MapPropertyOptions mapOptions = null)
 {
     return(DynamicAccessorFactory.CreateDynamicAccessor <T>(mapOptions ?? MapPropertyOptions.Safety));
 }