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); }
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(); }
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); } }
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); }
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)); }
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(); }
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); }
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(); }
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); } } }