Esempio n. 1
0
        public override OeSelectItem Translate(ExpandedNavigationSelectItem item)
        {
            if (_navigationNextLink && Cache.UriCompare.OeComparerExtension.GetNavigationNextLink(item))
            {
                return(null);
            }

            Type itemType;
            IEdmNavigationProperty navigationProperty = (((NavigationPropertySegment)item.PathToNavigationProperty.LastSegment).NavigationProperty);
            OeSelectItem           navigationItem     = _navigationItem.FindChildrenNavigationItem(navigationProperty);

            if (navigationItem == null)
            {
                navigationItem = new OeSelectItem(_navigationItem, item, _skipToken);
                _navigationItem.AddNavigationItem(navigationItem);

                Expression innerSource = GetInnerSource(navigationItem, item);
                _source = _joinBuilder.Build(_source, innerSource, _navigationItem.GetJoinPath(), navigationProperty);

                itemType = OeExpressionHelper.GetCollectionItemType(innerSource.Type);
            }
            else
            {
                itemType = _visitor.EdmModel.GetClrType(navigationItem.EntitySet.EntityType());
            }

            var selectTranslator = new OeSelectTranslator(_joinBuilder, navigationItem);

            _source = selectTranslator.BuildSelect(item.SelectAndExpand, _source, _navigationNextLink, _skipToken);

            return(navigationItem);
        }
        public Expression ApplySelect(Expression source, OeQueryContext queryContext)
        {
            if (queryContext.ODataUri.Path.LastSegment is CountSegment)
            {
                return(source);
            }

            var selectTranslator = new Translators.OeSelectTranslator(_joinBuilder, queryContext.ODataUri.Path, queryContext.MetadataLevel);

            source = selectTranslator.Build(source, queryContext);
            _entryFactoryFactory = selectTranslator.CreateEntryFactory;

            ChangeParameterType(source);
            return(source);
        }
Esempio n. 3
0
        public Expression ApplySelect(Expression source, OeQueryContext queryContext)
        {
            if (queryContext.ODataUri.Path.LastSegment is CountSegment)
            {
                return(source);
            }

            var selectTranslator           = new Translators.OeSelectTranslator(queryContext.EdmModel, _joinBuilder, queryContext.ODataUri);
            var selectTranslatorParameters = new Translators.OeSelectTranslatorParameters()
            {
                IsDatabaseNullHighestValue = queryContext.IsDatabaseNullHighestValue,
                MetadataLevel       = queryContext.MetadataLevel,
                SkipTokenNameValues = queryContext.SkipTokenNameValues
            };

            source = selectTranslator.Build(source, ref selectTranslatorParameters, out _entryFactoryFactory);

            ChangeParameterType(source);
            return(source);
        }
Esempio n. 4
0
        public override OeEntryFactory CreateEntryFactory(IEdmEntitySet entitySet, Type clrType, OePropertyAccessor[]?skipTokenAccessors)
        {
            ParameterExpression parameter      = Expression.Parameter(typeof(Object));
            UnaryExpression     typedParameter = Expression.Convert(parameter, clrType);

            if (_rootNavigationItem.HasNavigationItems())
            {
                List <OeNavigationSelectItem>    navigationItems      = OeSelectTranslator.FlattenNavigationItems(_rootNavigationItem, true);
                IReadOnlyList <MemberExpression> navigationProperties = OeExpressionHelper.GetPropertyExpressions(typedParameter);
                int propertyIndex = navigationProperties.Count - 1;

                for (int i = navigationItems.Count - 1; i >= 0; i--)
                {
                    OeNavigationSelectItem navigationItem = navigationItems[i];
                    if (navigationItem.Kind == OeNavigationSelectItemKind.NotSelected)
                    {
                        propertyIndex--;
                        continue;
                    }

                    OePropertyAccessor[]       accessors             = Array.Empty <OePropertyAccessor>();
                    LambdaExpression?          linkAccessor          = null;
                    OeNavigationEntryFactory[] nestedNavigationLinks = Array.Empty <OeNavigationEntryFactory>();
                    if (navigationItem.Kind != OeNavigationSelectItemKind.NextLink)
                    {
                        accessors             = GetAccessors(navigationProperties[propertyIndex].Type, navigationItem);
                        linkAccessor          = Expression.Lambda(navigationProperties[propertyIndex], parameter);
                        nestedNavigationLinks = GetNestedNavigationLinks(navigationItem);
                        propertyIndex--;
                    }

                    if (i == 0)
                    {
                        navigationItem.EntryFactory = new OeEntryFactory(navigationItem.EntitySet, accessors, skipTokenAccessors, nestedNavigationLinks, linkAccessor);
                    }
                    else
                    {
                        navigationItem.EntryFactory = new OeNavigationEntryFactory(
                            navigationItem.EntitySet,
                            accessors,
                            skipTokenAccessors,
                            nestedNavigationLinks,
                            linkAccessor,
                            navigationItem.EdmProperty,
                            navigationItem.NavigationSelectItem,
                            navigationItem.Kind == OeNavigationSelectItemKind.NextLink);
                    }
                }
            }
            else
            {
                var navigationLinks = new OeNavigationEntryFactory[_rootNavigationItem.NavigationItems.Count];
                for (int i = 0; i < _rootNavigationItem.NavigationItems.Count; i++)
                {
                    OeNavigationSelectItem navigationItem = _rootNavigationItem.NavigationItems[i];
                    navigationLinks[i] = new OeNavigationEntryFactory(
                        navigationItem.EntitySet,
                        Array.Empty <OePropertyAccessor>(),
                        null,
                        Array.Empty <OeNavigationEntryFactory>(),
                        null,
                        navigationItem.EdmProperty,
                        navigationItem.NavigationSelectItem,
                        navigationItem.Kind == OeNavigationSelectItemKind.NextLink);
                }

                OePropertyAccessor[] accessors = GetAccessors(clrType, _rootNavigationItem);
                _rootNavigationItem.EntryFactory = new OeEntryFactory(_rootNavigationItem.EntitySet, accessors, skipTokenAccessors, navigationLinks);
            }

            return(_rootNavigationItem.EntryFactory);
        }