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