示例#1
0
        public async Task WriteAsync(OeEntryFactory entryFactory, IAsyncEnumerator <Object> asyncEnumerator)
        {
            var resourceSet = new ODataResourceSet()
            {
                Count = _queryContext.TotalCountOfItems
            };
            await _writer.WriteStartAsync(resourceSet).ConfigureAwait(false);

            Object?rawValue  = null;
            int    readCount = 0;

            Db.IOeDbEnumerator dbEnumerator = entryFactory.IsTuple ?
                                              (Db.IOeDbEnumerator) new Db.OeDbEnumerator(asyncEnumerator, entryFactory) : new Db.OeEntityDbEnumerator(asyncEnumerator, entryFactory);
            while (await dbEnumerator.MoveNextAsync().ConfigureAwait(false))
            {
                await WriteEntry(dbEnumerator, dbEnumerator.Current).ConfigureAwait(false);

                readCount++;
                rawValue = dbEnumerator.RawValue;
                dbEnumerator.ClearBuffer();
            }

            if (rawValue != null)
            {
                var nextPageLinkBuilder = new OeNextPageLinkBuilder(_queryContext);
                resourceSet.NextPageLink = nextPageLinkBuilder.GetNextPageLinkRoot(entryFactory, readCount, _queryContext.TotalCountOfItems, rawValue);
            }

            await _writer.WriteEndAsync().ConfigureAwait(false);
        }
示例#2
0
 private async Task WriteLazyNestedCollection(Db.IOeDbEnumerator dbEnumerator)
 {
     _writer.WriteStart(new ODataResourceSet());
     do
     {
         Object value = dbEnumerator.Current;
         if (value != null)
         {
             await WriteEntry(dbEnumerator, value, false).ConfigureAwait(false);
         }
     }while (await dbEnumerator.MoveNextAsync().ConfigureAwait(false));
     _writer.WriteEnd();
 }
示例#3
0
            private async Task WriteNestedItem(Db.IOeDbEnumerator dbEnumerator)
            {
                Object value = dbEnumerator.Current;

                if (value == null)
                {
                    _writer.WriteStart((ODataResource)null);
                    _writer.WriteEnd();
                }
                else
                {
                    await WriteEntry(dbEnumerator, value, false).ConfigureAwait(false);
                }
            }
示例#4
0
        private async Task WriteNavigationSingle(Db.IOeDbEnumerator dbEnumerator)
        {
            Object value = dbEnumerator.Current;

            if (value == null)
            {
                await _writer.WriteStartAsync((ODataResource?)null).ConfigureAwait(false);

                await _writer.WriteEndAsync().ConfigureAwait(false);
            }
            else
            {
                await WriteEntry(dbEnumerator, value).ConfigureAwait(false);
            }
        }
        private async Task WriteNavigationCollection(Db.IOeDbEnumerator dbEnumerator)
        {
            var              entryFactory = (OeNavigationEntryFactory)dbEnumerator.EntryFactory;
            Object           value;
            int              readCount   = 0;
            ODataResourceSet?resourceSet = null;

            do
            {
                value = dbEnumerator.Current;
                if (value != null)
                {
                    if (resourceSet == null)
                    {
                        resourceSet = new ODataResourceSet();
                        if (entryFactory.NavigationSelectItem.CountOption.GetValueOrDefault())
                        {
                            resourceSet.Count = OeNextPageLinkBuilder.GetNestedCount(_queryContext.EdmModel, dbEnumerator);
                        }
                        await _writer.WriteStartAsync(resourceSet).ConfigureAwait(false);
                    }

                    await WriteEntry(dbEnumerator, value).ConfigureAwait(false);

                    readCount++;
                }
            }while (await dbEnumerator.MoveNextAsync().ConfigureAwait(false));

            if (resourceSet == null)
            {
                resourceSet = new ODataResourceSet();
                if (entryFactory.NavigationSelectItem.CountOption.GetValueOrDefault())
                {
                    resourceSet.Count = 0;
                }
                await _writer.WriteStartAsync(resourceSet).ConfigureAwait(false);
            }
            else
            {
                var nextPageLinkBuilder = new OeNextPageLinkBuilder(_queryContext);
                resourceSet.NextPageLink = nextPageLinkBuilder.GetNextPageLinkNavigation(dbEnumerator, readCount, resourceSet.Count, value !);
            }

            await _writer.WriteEndAsync().ConfigureAwait(false);
        }
示例#6
0
        private async Task WriteEntry(Db.IOeDbEnumerator dbEnumerator, Object value)
        {
            OeEntryFactory entryFactory = dbEnumerator.EntryFactory;
            ODataResource  entry        = CreateEntry(entryFactory, value);
            await _writer.WriteStartAsync(entry).ConfigureAwait(false);

            for (int i = 0; i < entryFactory.NavigationLinks.Count; i++)
            {
                if (entryFactory.NavigationLinks[i].NextLink)
                {
                    await WriteNavigationNextLink(entryFactory, entryFactory.NavigationLinks[i].NavigationSelectItem, value).ConfigureAwait(false);
                }
                else
                {
                    await WriteNavigation(dbEnumerator.CreateChild(entryFactory.NavigationLinks[i], _cancellationToken)).ConfigureAwait(false);
                }
            }
            await _writer.WriteEndAsync().ConfigureAwait(false);
        }
        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));
        }
示例#8
0
 private async Task WriteNavigationLink(Db.IOeDbEnumerator dbEnumerator)
 {
     _writer.WriteStart(dbEnumerator.EntryFactory.ResourceInfo);
     if (dbEnumerator.EntryFactory.ResourceInfo.IsCollection.GetValueOrDefault())
     {
         if (dbEnumerator.EntryFactory.CountOption.GetValueOrDefault())
         {
             await WriteEagerNestedCollection(dbEnumerator).ConfigureAwait(false);
         }
         else
         {
             await WriteLazyNestedCollection(dbEnumerator).ConfigureAwait(false);
         }
     }
     else
     {
         await WriteNestedItem(dbEnumerator);
     }
     _writer.WriteEnd();
 }
示例#9
0
        private async Task WriteNavigation(Db.IOeDbEnumerator dbEnumerator)
        {
            bool isCollection = dbEnumerator.EntryFactory.EdmNavigationProperty.Type.Definition is EdmCollectionType;
            var  resourceInfo = new ODataNestedResourceInfo()
            {
                IsCollection = isCollection,
                Name         = dbEnumerator.EntryFactory.EdmNavigationProperty.Name
            };
            await _writer.WriteStartAsync(resourceInfo).ConfigureAwait(false);

            if (isCollection)
            {
                await WriteNavigationCollection(dbEnumerator).ConfigureAwait(false);
            }
            else
            {
                await WriteNavigationSingle(dbEnumerator).ConfigureAwait(false);
            }

            await _writer.WriteEndAsync().ConfigureAwait(false);
        }
示例#10
0
            private async Task WriteEntry(Db.IOeDbEnumerator dbEnumerator, Object value, bool navigationNextLink)
            {
                OeEntryFactory entryFactory = dbEnumerator.EntryFactory;
                ODataResource  entry        = CreateEntry(entryFactory, value);

                _writer.WriteStart(entry);
                for (int i = 0; i < entryFactory.NavigationLinks.Count; i++)
                {
                    await WriteNavigationLink(dbEnumerator.CreateChild(entryFactory.NavigationLinks[i])).ConfigureAwait(false);
                }

                if (navigationNextLink)
                {
                    foreach (ExpandedNavigationSelectItem item in GetExpandedNavigationSelectItems(_queryContext.ODataUri.SelectAndExpand))
                    {
                        WriteNavigationNextLink(entryFactory, item, value);
                    }
                }

                _writer.WriteEnd();
            }
示例#11
0
            private async Task WriteEagerNestedCollection(Db.IOeDbEnumerator dbEnumerator)
            {
                var items = new List <Object>();

                do
                {
                    Object value = dbEnumerator.Current;
                    if (value != null)
                    {
                        items.Add(value);
                    }
                }while (await dbEnumerator.MoveNextAsync().ConfigureAwait(false));

                _writer.WriteStart(new ODataResourceSet()
                {
                    Count = items.Count
                });
                for (int i = 0; i < items.Count; i++)
                {
                    await WriteEntry(dbEnumerator, items[i], false).ConfigureAwait(false);
                }
                _writer.WriteEnd();
            }
        public static int GetNestedCount(IEdmModel edmModel, Db.IOeDbEnumerator dbEnumerator)
        {
            Db.IOeDbEnumerator parentEnumerator = dbEnumerator.ParentEnumerator;
            ODataUri           odataUri         = OeNextPageLinkBuilder.GetCountODataUri(edmModel, parentEnumerator.EntryFactory, dbEnumerator.EntryFactory.NavigationSelectItem, parentEnumerator.Current);
            var queryContext = new OeQueryContext(edmModel, odataUri);

            IEdmEntitySet entitySet = (odataUri.Path.FirstSegment as EntitySetSegment).EntitySet;

            Db.OeDataAdapter dataAdapter = edmModel.GetDataAdapter(entitySet.Container);
            Object           dataContext = null;

            try
            {
                dataContext = dataAdapter.CreateDataContext();
                return(dataAdapter.ExecuteScalar <int>(dataContext, queryContext));
            }
            finally
            {
                if (dataContext != null)
                {
                    dataAdapter.CloseDataContext(dataContext);
                }
            }
        }