public async Task NextPageLink() { String request = "OrderItems?$orderby=Id&$count=true"; const int pageSize = 2; var pageNextLinkModelBoundBuilder = new PageNextLinkModelBoundBuilder(Fixture.OeEdmModel, Fixture.IsSqlite); Query.OeModelBoundProvider modelBoundProvider = pageNextLinkModelBoundBuilder.BuildProvider(pageSize, false); OeParser parser = Fixture.CreateParser(request, modelBoundProvider); var uri = new Uri(parser.BaseUri, request); long count = -1; var fromOe = new List <Object>(); do { var response = new MemoryStream(); await parser.ExecuteGetAsync(uri, OeRequestHeaders.JsonDefault, response, CancellationToken.None).ConfigureAwait(false); var reader = new ResponseReader(parser.EdmModel); response.Position = 0; List <Object> result = reader.Read(response).Cast <Object>().ToList(); Assert.InRange(result.Count, 0, pageSize); fromOe.AddRange(result); if (count < 0) { count = reader.ResourceSet.Count.GetValueOrDefault(); } uri = reader.ResourceSet.NextPageLink; }while (uri != null); Assert.Equal(count, fromOe.Count); IList fromDb; using (var context = Fixture.CreateContext()) fromDb = context.OrderItems.OrderBy(i => i.Id).ToList(); TestHelper.Compare(fromDb, fromOe, null); }
public async Task <IList> ExecuteOe <TResult>(String requestUri, bool navigationNextLink, int pageSize) { OeModelBoundProvider modelBoundProvider = ModelBoundProvider; if (modelBoundProvider == null) { var modelBoundProviderBuilder = new PageNextLinkModelBoundBuilder(OeEdmModel, IsSqlite); modelBoundProvider = modelBoundProviderBuilder.BuildProvider(pageSize, navigationNextLink); } OeParser parser = CreateParser(requestUri, modelBoundProvider); var uri = new Uri(parser.BaseUri, requestUri); OeRequestHeaders requestHeaders = OeRequestHeaders.JsonDefault.SetMaxPageSize(pageSize); long count = -1; ODataUri odataUri; var fromOe = new List <Object>(); do { odataUri = ParseUri(uri.OriginalString); var response = new MemoryStream(); await parser.ExecuteQueryAsync(odataUri, requestHeaders, response, CancellationToken.None).ConfigureAwait(false); response.Position = 0; List <Object> result; ResponseReader responseReader; if (typeof(TResult).IsPrimitive) { TypeConverter converter = TypeDescriptor.GetConverter(typeof(TResult)); return(new Object[] { converter.ConvertFromString(new StreamReader(response).ReadToEnd()) }); } { responseReader = new OpenTypeResponseReader(TestHelper.GetEdmModel(DbEdmModel, odataUri.Path), ServiceProvider); result = responseReader.Read(response).Cast <Object>().ToList(); } if (pageSize > 0) { Xunit.Assert.InRange(result.Count, 0, requestHeaders.MaxPageSize); } fromOe.AddRange(result); await responseReader.FillNextLinkProperties(parser, CancellationToken.None).ConfigureAwait(false); if (count < 0) { count = responseReader.ResourceSet.Count.GetValueOrDefault(); } uri = responseReader.ResourceSet.NextPageLink; }while (uri != null); if (odataUri.QueryCount != null) { Xunit.Assert.Equal(count, fromOe.Count); } return(fromOe); }
internal static async Task <List <Object> > OrdersCountItemsCount(DbFixture fixture, String request, Func <Model.OrderItem, bool> orderItemPredicate, int maxPageSize, bool navigationNextLink) { Query.OeModelBoundProvider modelBoundProvider = fixture.ModelBoundProvider; if (modelBoundProvider == null) { var modelBoundProviderBuilder = new PageNextLinkModelBoundBuilder(fixture.OeEdmModel, fixture.IsSqlite); modelBoundProvider = modelBoundProviderBuilder.BuildProvider(maxPageSize, navigationNextLink); } OeParser parser = fixture.CreateParser(request, modelBoundProvider); Uri uri = new Uri(parser.BaseUri, request); int expectedCount; long count = -1; var fromOe = new List <Object>(); do { var response = new MemoryStream(); await parser.ExecuteGetAsync(uri, OeRequestHeaders.JsonDefault.SetMaxPageSize(maxPageSize), response, CancellationToken.None).ConfigureAwait(false); response.Position = 0; var reader = new ResponseReader(parser.EdmModel); List <Object> result = reader.Read(response).Cast <Object>().ToList(); fromOe.AddRange(result); if (maxPageSize > 0) { Assert.InRange(result.Count, 0, maxPageSize); } var navigationPropertyParser = new OeParser(parser.BaseUri, parser.EdmModel, fixture.ModelBoundProvider); foreach (dynamic order in result) { using (var dbContext = fixture.CreateContext()) { String orderName = order.Name; expectedCount = dbContext.OrderItems.Where(i => i.Order.Name == orderName).ToList().Where(orderItemPredicate).Count(); } var navigationProperty = (IEnumerable)order.Items; ResponseReader.NavigationInfo info = reader.GetNavigationInfo(navigationProperty); if (!navigationNextLink && !uri.OriginalString.Contains("$skiptoken=")) { Assert.Equal(expectedCount, info.Count); } var navigationPropertyResponse = new MemoryStream(); await navigationPropertyParser.ExecuteGetAsync(info.NextPageLink, OeRequestHeaders.JsonDefault, navigationPropertyResponse, CancellationToken.None).ConfigureAwait(false); navigationPropertyResponse.Position = 0; var navigationPropertyReader = new ResponseReader(parser.EdmModel); foreach (dynamic orderItem in navigationPropertyReader.Read(navigationPropertyResponse)) { order.Items.Add(orderItem); } if (navigationNextLink) { Assert.Equal(expectedCount, navigationPropertyReader.ResourceSet.Count); } } if (count < 0) { count = reader.ResourceSet.Count.GetValueOrDefault(); } uri = reader.ResourceSet.NextPageLink; }while (uri != null); using (var dbContext = fixture.CreateContext()) expectedCount = dbContext.Orders.Count(); Assert.Equal(expectedCount, count); return(fromOe); }
public static OeModelBoundProvider CreateModelBoundProvider(IEdmModel edmModel, int pageSize) { var pageNextLinkModelBoundBuilder = new Test.PageNextLinkModelBoundBuilder(edmModel, false); return(pageNextLinkModelBoundBuilder.BuildProvider(pageSize, false)); }