private Expression BuildSkipTakeSource(Expression source, OeSkipTokenNameValue[] skipTokenNameValues, bool isDatabaseNullHighestValue)
        {
            BuildOrderBySkipTake(_rootNavigationItem, _odataUri.OrderBy, HasSelectItems(_odataUri.SelectAndExpand));
            source = BuildJoin(source, new OeNavigationSelectItem[] { _rootNavigationItem });

            long?top = GetTop(_rootNavigationItem, _odataUri.Top);

            if (top == null && _odataUri.Skip == null)
            {
                return(source);
            }

            var expressionBuilder = new OeExpressionBuilder(_joinBuilder);

            source = expressionBuilder.ApplySkipToken(source, skipTokenNameValues, _odataUri.OrderBy, isDatabaseNullHighestValue);
            source = expressionBuilder.ApplyOrderBy(source, _odataUri.OrderBy);
            source = expressionBuilder.ApplySkip(source, _odataUri.Skip, _odataUri.Path);
            return(expressionBuilder.ApplyTake(source, top, _odataUri.Path));

            bool HasSelectItems(SelectExpandClause selectExpandClause)
            {
                if (selectExpandClause != null)
                {
                    foreach (SelectItem odataSelectItem in selectExpandClause.SelectedItems)
                    {
                        if (odataSelectItem is PathSelectItem pathSelectItem && pathSelectItem.SelectedPath.LastSegment is PropertySegment)
                        {
                            return(true);
                        }
                    }
                }

                return(false);
            }
        }
Beispiel #2
0
        private static Expression BuildSkipTakeSource(Expression source, OeQueryContext queryContext, OeSelectItem navigationItem)
        {
            bool hasSelectItems = HasSelectItems(queryContext.ODataUri.SelectAndExpand);

            source = BuildOrderBySkipToken(navigationItem, queryContext.ODataUri.OrderBy, source, queryContext.JoinBuilder, hasSelectItems);
            queryContext.JoinBuilder.Visitor.ChangeParameterType(source);

            var expressionBuilder = new OeExpressionBuilder(queryContext.JoinBuilder);

            source = expressionBuilder.ApplySkipToken(source, queryContext.SkipTokenNameValues, queryContext.ODataUri.OrderBy, queryContext.IsDatabaseNullHighestValue);
            source = expressionBuilder.ApplyOrderBy(source, queryContext.ODataUri.OrderBy);
            source = expressionBuilder.ApplySkip(source, queryContext.ODataUri.Skip, queryContext.ODataUri.Path);
            return(expressionBuilder.ApplyTake(source, queryContext.ODataUri.Top, queryContext.ODataUri.Path));
        }
Beispiel #3
0
        private Expression BuildSkipTakeSource(Expression source, OeSkipTokenNameValue[] skipTokenNameValues, bool isDatabaseNullHighestValue)
        {
            BuildOrderBySkipTake(_rootNavigationItem, _odataUri.OrderBy, HasSelectItems(_odataUri.SelectAndExpand));
            source = BuildJoin(source, new OeNavigationSelectItem[] { _rootNavigationItem });

            long?top = GetTop(_rootNavigationItem, _odataUri.Top);

            if (top == null && _odataUri.Skip == null)
            {
                return(source);
            }

            var expressionBuilder = new OeExpressionBuilder(_joinBuilder);

            source = expressionBuilder.ApplySkipToken(source, skipTokenNameValues, _odataUri.OrderBy, isDatabaseNullHighestValue);
            source = expressionBuilder.ApplyOrderBy(source, _odataUri.OrderBy);
            source = expressionBuilder.ApplySkip(source, _odataUri.Skip, _odataUri.Path);
            return(expressionBuilder.ApplyTake(source, top, _odataUri.Path));