Ejemplo n.º 1
0
        public MappingPlanData GetElementMappingPlanData(MethodCallExpression mapCall)
        {
            var enumerableMappingData = GetMappingDataFor((ParameterExpression)mapCall.Object);
            var elementMappingData    = ObjectMappingDataFactory.ForElement(enumerableMappingData);

            return(new MappingPlanData(elementMappingData));
        }
        private IObjectMappingData GetEntryMappingData(IObjectMappingData mappingData)
        {
            var sourceElementType = _wrappedBuilder.Context.SourceElementType;
            var targetElementType = _targetDictionaryMember.GetElementType(sourceElementType);

            return(ObjectMappingDataFactory.ForElement(sourceElementType, targetElementType, mappingData));
        }
Ejemplo n.º 3
0
        private IQueryable <TResultElement> PerformProjection <TResultElement>(MapperContext mapperContext)
        {
            var rootMappingData = ObjectMappingDataFactory.ForProjection <TSourceElement, TResultElement>(
                _sourceQueryable,
                mapperContext.QueryProjectionMappingContext);

            var queryProjection = rootMappingData.MapStart();

            return(queryProjection);
        }
        public static IDataSource Create(
            IQualifiedMember sourceMember,
            int dataSourceIndex,
            IChildMemberMappingData childMappingData)
        {
            var childMapperData = childMappingData.MapperData;

            if (!childMapperData.MapperContext.UserConfigurations.HasMappingFactories)
            {
                return(new NullDataSource(Constants.EmptyExpression));
            }

            var childObjectMappingData = ObjectMappingDataFactory.ForChild(
                sourceMember,
                childMapperData.TargetMember,
                dataSourceIndex,
                childMappingData.Parent);

            var childCreationContext = new MappingCreationContext(childObjectMappingData);

            var mapping = ConfiguredMappingFactory
                          .GetMappingOrNull(childCreationContext, out _);

            if (mapping == null)
            {
                return(new NullDataSource(Constants.EmptyExpression));
            }

            var childObjectMapperData = childObjectMappingData.MapperData;
            var sourceMemberAccess    = sourceMember.GetRelativeQualifiedAccess(childMapperData);
            var targetMemberAccess    = childMapperData.GetTargetMemberAccess();

            var mappingValues = new MappingValues(
                sourceMemberAccess,
                targetMemberAccess,
                childMapperData.ElementIndex,
                childMapperData.ElementKey,
                dataSourceIndex);

            var directAccessMapping = MappingFactory.GetDirectAccessMapping(
                mapping,
                childObjectMapperData,
                mappingValues,
                MappingDataCreationFactory.ForChild(mappingValues, childObjectMapperData));

            var returnValue = childObjectMapperData
                              .GetFinalisedReturnValue(directAccessMapping, out var returnsDefault);

            if (returnsDefault)
            {
                returnValue = Expression.Block(directAccessMapping, returnValue);
            }

            return(new AdHocDataSource(sourceMember, returnValue, childMapperData));
        }
        private Expression GetDictionaryToElementMapping(IObjectMappingData enumerableMappingData)
        {
            var elementMappingData = ObjectMappingDataFactory.ForElement(
                MapperData.SourceType,
                _builder.Context.TargetElementType,
                enumerableMappingData);

            var dictionaryToElementMapping = MappingFactory.GetElementMapping(
                MapperData.SourceObject,
                _builder.Context.TargetElementType.ToDefaultExpression(),
                elementMappingData);

            return(dictionaryToElementMapping);
        }
Ejemplo n.º 6
0
        private TTarget PerformMapping <TTarget>(TTarget target)
        {
            if (MappingTypes <TSource, TTarget> .SkipTypesCheck)
            {
                // Optimise for the most common scenario:
                var typedRootMappingData = ObjectMappingDataFactory
                                           .ForRootFixedTypes(_source, target, this);

                return(typedRootMappingData.MapStart());
            }

            var rootMappingData = ObjectMappingDataFactory.ForRoot(_source, target, this);
            var result          = rootMappingData.MapStart();

            return((TTarget)result);
        }
Ejemplo n.º 7
0
        private IQualifiedMember GetMatchingSourceMember <TSource, TTarget>(
            TSource source,
            TTarget target,
            Expression <Func <TTarget, object> > childMemberExpression)
        {
            var targetMember = TargetMemberFor(childMemberExpression);

            var mappingContext  = new SimpleMappingContext(DefaultMapperContext.RuleSets.CreateNew, DefaultMapperContext);
            var rootMappingData = ObjectMappingDataFactory.ForRoot(source, target, mappingContext);
            var rootMapperData  = rootMappingData.MapperData;

            var childMapperData     = new ChildMemberMapperData(targetMember, rootMapperData);
            var childMappingContext = rootMappingData.GetChildMappingData(childMapperData);

            return(SourceMemberMatcher.GetMatchFor(childMappingContext, out _));
        }
Ejemplo n.º 8
0
        private static IObjectMappingData GetMappingDataFor(ParameterExpression mapCallSubject, IObjectMappingData mappingData)
        {
            if (MappingDataObjectMatches(mapCallSubject, mappingData))
            {
                return(mappingData);
            }

            return(mappingData.MapperData
                   .ChildMapperDatas
                   .Select(childMapperData => childMapperData.TargetMemberIsEnumerableElement()
                    ? ObjectMappingDataFactory.ForElement(mappingData)
                    : ObjectMappingDataFactory.ForChild(
                               childMapperData.TargetMember.RegistrationName,
                               childMapperData.DataSourceIndex,
                               mappingData))
                   .Select(childMappingData => GetMappingDataFor(mapCallSubject, childMappingData))
                   .First(matchingMappingData => matchingMappingData != null));
        }
Ejemplo n.º 9
0
        public MappingPlanData GetChildMappingPlanData(MethodCallExpression mapCall)
        {
            var targetMemberName  = (string)((ConstantExpression)mapCall.Arguments[2]).Value;
            var dataSourceIndex   = (int)((ConstantExpression)mapCall.Arguments[3]).Value;
            var parentMappingData = GetMappingDataFor((ParameterExpression)mapCall.Object);

            if (!parentMappingData.MapperData.Context.IsStandalone)
            {
                EnsureMapperCreation(parentMappingData.Mapper);
            }

            var childMappingData = ObjectMappingDataFactory.ForChild(
                targetMemberName,
                dataSourceIndex,
                parentMappingData);

            return(new MappingPlanData(childMappingData));
        }
Ejemplo n.º 10
0
        public IObjectMappingData ToMappingData <TSource, TTarget>()
        {
            if ((_mappingData != null) &&
                _mappingData.MappingTypes.Equals(MappingTypes <TSource, TTarget> .Fixed))
            {
                return(_mappingData);
            }

            var ruleSet = IsForAllRuleSets
                ? MapperContext.RuleSets.CreateNew
                : RuleSet;

            var mappingContext = new SimpleMappingContext(ruleSet, MapperContext);

            _mappingData = ObjectMappingDataFactory
                           .ForRootFixedTypes <TSource, TTarget>(mappingContext, createMapper: false);

            return(_mappingData);
        }
Ejemplo n.º 11
0
        private static bool TryGetMetaMember(
            IList <string> memberNameParts,
            DataSourceFindContext context,
            out MetaMemberPartBase metaMember)
        {
            var currentMappingData  = default(IObjectMappingData);
            var currentSourceMember = default(IQualifiedMember);
            var currentTargetMember = default(QualifiedMember);
            var currentMemberPart   = metaMember = default(MetaMemberPartBase);

            Func <IQualifiedMember, QualifiedMember, IObjectMappingData, DataSourceFindContext, IObjectMappingData> currentMappingDataFactory =
                (sm, tm, md, c) => c.ChildMappingData.Parent;

            for (var i = memberNameParts.Count - 1; i >= 0; --i)
            {
                var memberNamePart = memberNameParts[i];

                switch (memberNamePart)
                {
                case HasMetaMemberPart.Name:
                    if (HasMetaMemberPart.TryCreateFor(context.MapperData, ref currentMemberPart))
                    {
                        break;
                    }

                    return(false);

                case FirstMetaMemberPart.Name:
                    currentMemberPart = new FirstMetaMemberPart(context.MapperData);
                    break;

                case LastMetaMemberPart.Name:
                    currentMemberPart = new LastMetaMemberPart(context.MapperData);
                    break;

                case CountMetaMemberPart.Name:
                    if (CountMetaMemberPart.TryCreateFor(context.MapperData, ref currentMemberPart))
                    {
                        break;
                    }

                    return(false);

                case NumberOfMetaMemberPart.Name:
                    if (NumberOfMetaMemberPart.TryCreateFor(context.MapperData, ref currentMemberPart))
                    {
                        break;
                    }

                    return(false);

                default:
                    currentMappingData = currentMappingDataFactory.Invoke(
                        currentSourceMember,
                        currentTargetMember,
                        currentMappingData,
                        context);

                    var currentMapperData = currentMappingData.MapperData;

                    var matchingTargetMember = GlobalContext.Instance
                                               .MemberCache
                                               .GetTargetMembers(currentMapperData.TargetType)
                                               .FirstOrDefault(m => m.Name == memberNamePart);

                    if (matchingTargetMember == null)
                    {
                        matchingTargetMember = GlobalContext.Instance
                                               .MemberCache
                                               .GetSourceMembers(currentMapperData.SourceType)
                                               .FirstOrDefault(m => m.Name == memberNamePart);

                        if (matchingTargetMember == null)
                        {
                            return(false);
                        }
                    }

                    currentTargetMember = currentMapperData.TargetMember.Append(matchingTargetMember);

                    var childMemberMapperData = new ChildMemberMapperData(currentTargetMember, currentMapperData);

                    var memberMappingData = currentMappingData.GetChildMappingData(childMemberMapperData);

                    currentSourceMember = SourceMemberMatcher.GetMatchFor(
                        memberMappingData,
                        out _,
                        searchParentContexts: false);

                    if (currentSourceMember == null)
                    {
                        return(false);
                    }

                    currentMemberPart = new SourceMemberMetaMemberPart(
                        currentSourceMember,
                        currentMapperData,
                        isRootMemberPart: currentMemberPart == null);

                    currentMappingDataFactory = (sm, tm, md, c) =>
                    {
                        var mappingData = ObjectMappingDataFactory.ForChild(sm, tm, 0, md);

                        return(sm.IsEnumerable
                                ? ObjectMappingDataFactory.ForElement(mappingData)
                                : ObjectMappingDataFactory.ForChild(sm, tm, 0, md));
                    };

                    break;
                }

                if (metaMember == null)
                {
                    metaMember = currentMemberPart;
                    continue;
                }

                if (!metaMember.TrySetNextPart(currentMemberPart))
                {
                    return(false);
                }
            }

            return(true);
        }
Ejemplo n.º 12
0
 MappingPlan IProjectionPlanTargetSelector <TSource> .To <TResult>()
 {
     return(GetMappingPlan <TResult>(
                _mapperContext.QueryProjectionMappingContext,
                planContext => ObjectMappingDataFactory.ForProjection <TSource, TResult>(_exampleQueryable, planContext)));
 }
Ejemplo n.º 13
0
 public IObjectMappingData CreateRootMappingData <TDataSource, TDataTarget>(TDataSource source, TDataTarget target)
 => ObjectMappingDataFactory.ForRoot(source, target, this);