コード例 #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);
        }
コード例 #2
0
        private Expression BuildJoin(Expression source, IList <OeNavigationSelectItem> navigationItems)
        {
            for (int i = 1; i < navigationItems.Count; i++)
            {
                if (!navigationItems[i].AlreadyUsedInBuildExpression)
                {
                    navigationItems[i].AlreadyUsedInBuildExpression = true;

                    ODataPathSegment       segment            = navigationItems[i].NavigationSelectItem.PathToNavigationProperty.LastSegment;
                    IEdmNavigationProperty navigationProperty = (((NavigationPropertySegment)segment).NavigationProperty);
                    Expression             innerSource        = GetInnerSource(navigationItems[i]);
                    source = _joinBuilder.Build(_edmModel, source, innerSource, navigationItems[i].Parent.GetJoinPath(), navigationProperty);
                }
            }

            _joinBuilder.Visitor.ChangeParameterType(source);
            return(source);
        }
コード例 #3
0
        private Expression BuildJoin(Expression source, IList <OeNavigationSelectItem> navigationItems)
        {
            for (int i = 1; i < navigationItems.Count; i++)
            {
                OeNavigationSelectItem navigationItem = navigationItems[i];
                if (navigationItem.Parent == null)
                {
                    throw new InvalidOperationException("Parent is null must be first element in " + nameof(navigationItems));
                }

                if (!navigationItem.AlreadyUsedInBuildExpression)
                {
                    navigationItem.AlreadyUsedInBuildExpression = true;

                    ODataPathSegment       segment            = navigationItem.NavigationSelectItem.PathToNavigationProperty.LastSegment;
                    IEdmNavigationProperty navigationProperty = (((NavigationPropertySegment)segment).NavigationProperty);
                    Expression             innerSource        = GetInnerSource(navigationItem);
                    source = _joinBuilder.Build(_edmModel, source, innerSource, navigationItem.Parent.GetJoinPath(), navigationProperty);
                }
            }

            _joinBuilder.Visitor.ChangeParameterType(source);
            return(source);
        }