public Uri GetNextPageLinkNavigation(Db.IOeDbEnumerator dbEnumerator, int readCount, long?totalCount, Object value)
        {
            OeEntryFactory entryFactory = dbEnumerator.EntryFactory;
            ExpandedNavigationSelectItem navigationSelectItem = entryFactory.NavigationSelectItem;

            if (navigationSelectItem.GetPageSize() == 0 || readCount == 0 || (totalCount != null && readCount >= totalCount))
            {
                return(null);
            }

            OrderByClause orderByClause = OeSkipTokenParser.GetUniqueOrderBy(entryFactory.EntitySet, navigationSelectItem.OrderByOption, null);

            KeyValuePair <String, Object>[] keys = GetNavigationSkipTokenKeys(entryFactory, orderByClause, value);

            int    restCount = GetRestCountNavigation((int?)navigationSelectItem.TopOption, readCount, totalCount);
            String skipToken = OeSkipTokenParser.GetSkipToken(_queryContext.EdmModel, keys, restCount);

            return(GetNavigationUri(dbEnumerator.ParentEnumerator.EntryFactory, navigationSelectItem, orderByClause, dbEnumerator.ParentEnumerator.Current, skipToken));
        }
        private Uri GetNavigationUri(OeEntryFactory entryFactory, ExpandedNavigationSelectItem item, OrderByClause orderByClause, Object value, String skipToken)
        {
            bool?queryCount = item.CountOption;
            long?top        = item.TopOption;

            if (skipToken != null)
            {
                queryCount = null;
                int pageSize = item.GetPageSize();
                if (pageSize > 0 && (top == null || pageSize < top.GetValueOrDefault()))
                {
                    top = pageSize;
                }
            }

            FilterClause filterClause = GetFilter(_queryContext.EdmModel, entryFactory, item, value);

            if (filterClause == null)
            {
                return(null);
            }

            var entitytSet   = (IEdmEntitySet)(filterClause.RangeVariable as ResourceRangeVariable).NavigationSource;
            var pathSegments = new ODataPathSegment[] { new EntitySetSegment(entitytSet) };

            var odataUri = new ODataUri()
            {
                Filter          = filterClause,
                OrderBy         = orderByClause,
                Path            = new ODataPath(pathSegments),
                QueryCount      = queryCount,
                SelectAndExpand = item.SelectAndExpand,
                Skip            = item.SkipOption,
                SkipToken       = skipToken,
                Top             = top
            };

            return(odataUri.BuildUri(ODataUrlKeyDelimiter.Parentheses));
        }