コード例 #1
0
        private OeEntryFactory CreateEntryFactoryFromTuple(IEdmModel edmModel, OeEntryFactory?parentEntryFactory, OePropertyAccessor[] skipTokenAccessors)
        {
            OePropertyAccessor[] accessors = _allAccessors;
            if (IsTuple)
            {
                OePropertyAccessor[] propertyAccessors = OePropertyAccessor.CreateFromType(edmModel.GetClrType(EntitySet), EntitySet);
                accessors = new OePropertyAccessor[_allAccessors.Length];
                for (int i = 0; i < accessors.Length; i++)
                {
                    OePropertyAccessor accessor = Array.Find(propertyAccessors, pa => pa.EdmProperty == _allAccessors[i].EdmProperty);
                    if (Array.IndexOf(Accessors, _allAccessors[i]) == -1)
                    {
                        var convertExpression   = (UnaryExpression)accessor.PropertyExpression.Expression;
                        var parameterExpression = (ParameterExpression)convertExpression.Operand;
                        accessor = OePropertyAccessor.CreatePropertyAccessor(accessor.EdmProperty, accessor.PropertyExpression, parameterExpression, true);
                    }
                    accessors[i] = accessor;
                }
            }

            var navigationLinks = new OeEntryFactory[NavigationLinks.Count];

            for (int i = 0; i < NavigationLinks.Count; i++)
            {
                navigationLinks[i] = NavigationLinks[i].CreateEntryFactoryFromTuple(edmModel, this, Array.Empty <OePropertyAccessor>());
            }

            OeEntryFactoryOptions options;

            if (parentEntryFactory == null)
            {
                options = new OeEntryFactoryOptions()
                {
                    Accessors          = accessors,
                    EntitySet          = EntitySet,
                    NavigationLinks    = navigationLinks,
                    SkipTokenAccessors = skipTokenAccessors,
                };
                return(new OeEntryFactory(ref options));
            }

            ParameterExpression parameter      = Expression.Parameter(typeof(Object));
            UnaryExpression     typedParameter = Expression.Convert(parameter, edmModel.GetClrType(parentEntryFactory.EntitySet));
            MemberExpression    navigationPropertyExpression = Expression.Property(typedParameter, EdmNavigationProperty.Name);
            LambdaExpression    linkAccessor = Expression.Lambda(navigationPropertyExpression, parameter);

            options = new OeEntryFactoryOptions()
            {
                Accessors             = accessors,
                EdmNavigationProperty = EdmNavigationProperty,
                EntitySet             = EntitySet,
                LinkAccessor          = linkAccessor,
                NavigationLinks       = navigationLinks,
                NavigationSelectItem  = NavigationSelectItem,
                SkipTokenAccessors    = skipTokenAccessors,
            };
            return(new OeEntryFactory(ref options));
        }
コード例 #2
0
        public OeEntryFactory(ref OeEntryFactoryOptions options)
            : this(options.EntitySet, options.Accessors, options.SkipTokenAccessors)
        {
            _edmNavigationProperty = options.EdmNavigationProperty;
            LinkAccessor           = options.LinkAccessor == null ? null : (Func <Object, Object>)options.LinkAccessor.Compile();
            NavigationLinks        = options.NavigationLinks ?? Array.Empty <OeEntryFactory>();
            _navigationSelectItem  = options.NavigationSelectItem;
            NextLink = options.NextLink;

            if (!options.NextLink)
            {
                _equalityComparer = new Infrastructure.OeEntryEqualityComparer(GetKeyExpressions(options.EntitySet, options.Accessors));
                IsTuple          |= GetIsTuple(options.LinkAccessor);
            }
        }