コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        public static OeModelBoundProvider CreateModelBoundProvider(IEdmModel edmModel, int pageSize)
        {
            var pageNextLinkModelBoundBuilder = new Test.PageNextLinkModelBoundBuilder(edmModel, false);

            return(pageNextLinkModelBoundBuilder.BuildProvider(pageSize, false));
        }