internal async Task CountExpandNested() { String request = "Orders?$expand=Items($count=true)&orderby=Id"; ODataUri odataUri = Fixture.ParseUri(request); var parser = new OeParser(odataUri.ServiceRoot, Fixture.OeDataAdapter, Fixture.EdmModel); var uri = new Uri(odataUri.ServiceRoot, request); var response = new MemoryStream(); await parser.ExecuteQueryAsync(odataUri, OeRequestHeaders.JsonDefault, response, CancellationToken.None).ConfigureAwait(false); response.Position = 0; var actualCounts = new List <long>(); var reader = new ResponseReader(Fixture.EdmModel, Fixture.OeDataAdapter.EntitySetMetaAdapters); foreach (dynamic order in reader.Read(response)) { var navigationProperty = (IEnumerable)order.Items; actualCounts.Add(reader.GetResourceSet(navigationProperty).Count.Value); } List <long> expectedCounts; using (var dbContext = Fixture.CreateContext()) expectedCounts = dbContext.Orders.OrderBy(o => o.Id).Select(i => (long)i.Items.Count()).ToList(); Assert.Equal(expectedCounts, actualCounts); }
public async Task NavigationNextPageLink() { String request = "Orders?$expand=Items($filter=Count gt 0 or Count eq null;$orderby=Id;$count=true)&$orderby=Id&$count=true"; ODataUri odataUri = Fixture.ParseUri(request); var parser = new OeParser(odataUri.ServiceRoot, Fixture.OeDataAdapter, Fixture.EdmModel); var requestUri = new Uri(odataUri.ServiceRoot, request); Uri uri = requestUri; OeRequestHeaders requestHeaders = OeRequestHeaders.JsonDefault.SetMaxPageSize(1).SetNavigationNextLink(true); long count = -1; var fromOe = new List<Object>(); do { var response = new MemoryStream(); await parser.ExecuteGetAsync(uri, requestHeaders, response, CancellationToken.None).ConfigureAwait(false); response.Position = 0; var reader = new ResponseReader(Fixture.EdmModel, Fixture.OeDataAdapter); List<Object> result = reader.Read(response).Cast<Object>().ToList(); Assert.InRange(result.Count, 0, requestHeaders.MaxPageSize); fromOe.AddRange(result); var navigationPropertyParser = new OeParser(odataUri.ServiceRoot, Fixture.OeDataAdapter, Fixture.EdmModel); foreach (dynamic order in result) { var navigationProperty = (IEnumerable)order.Items; ODataResourceSetBase resourceSet = reader.GetResourceSet(navigationProperty); var navigationPropertyResponse = new MemoryStream(); await navigationPropertyParser.ExecuteGetAsync(resourceSet.NextPageLink, OeRequestHeaders.JsonDefault, navigationPropertyResponse, CancellationToken.None).ConfigureAwait(false); navigationPropertyResponse.Position = 0; var navigationPropertyReader = new ResponseReader(Fixture.EdmModel, Fixture.OeDataAdapter); foreach (dynamic orderItem in navigationPropertyReader.Read(navigationPropertyResponse)) order.Items.Add(orderItem); Assert.Equal(navigationPropertyReader.ResourceSet.Count, order.Items.Count); } if (count < 0) count = reader.ResourceSet.Count.GetValueOrDefault(); uri = reader.ResourceSet.NextPageLink; } while (uri != null); Assert.Equal(count, fromOe.Count); var exprectedResponse = new MemoryStream(); var expectedParser = new OeParser(odataUri.ServiceRoot, Fixture.OeDataAdapter, Fixture.EdmModel); await expectedParser.ExecuteGetAsync(requestUri, OeRequestHeaders.JsonDefault, exprectedResponse, CancellationToken.None).ConfigureAwait(false); exprectedResponse.Position = 0; var exprectedReader = new ResponseReader(Fixture.EdmModel, Fixture.OeDataAdapter); List<Object> expectedResult = exprectedReader.Read(exprectedResponse).Cast<Object>().ToList(); TestHelper.Compare(expectedResult, fromOe, null); }