コード例 #1
0
        public async Task QueryOperationDiagnostic()
        {
            int totalItems = 3;
            IList <ToDoActivity> itemList = await ToDoActivity.CreateRandomItems(
                this.Container,
                pkCount : totalItems,
                perPKItemCount : 1,
                randomPartitionKey : true);

            //Checking query metrics on typed query
            long totalOutputDocumentCount = await this.ExecuteQueryAndReturnOutputDocumentCount(
                queryText : "select * from ToDoActivity",
                expectedItemCount : totalItems);

            Assert.AreEqual(totalItems, totalOutputDocumentCount);

            totalOutputDocumentCount = await this.ExecuteQueryAndReturnOutputDocumentCount(
                queryText : "select * from ToDoActivity t ORDER BY t.cost",
                expectedItemCount : totalItems);

            Assert.AreEqual(totalItems, totalOutputDocumentCount);

            totalOutputDocumentCount = await this.ExecuteQueryAndReturnOutputDocumentCount(
                queryText : "select DISTINCT t.cost from ToDoActivity t",
                expectedItemCount : 1);

            Assert.IsTrue(totalOutputDocumentCount >= 1);

            totalOutputDocumentCount = await this.ExecuteQueryAndReturnOutputDocumentCount(
                queryText : "select * from ToDoActivity OFFSET 1 LIMIT 1",
                expectedItemCount : 1);

            Assert.IsTrue(totalOutputDocumentCount >= 1);
        }
コード例 #2
0
        public async Task ItemLINQWithCamelCaseSerializerOptions(bool isGatewayMode)
        {
            Action <CosmosClientBuilder> builder = action =>
            {
                action.WithSerializerOptions(new CosmosSerializationOptions()
                {
                    PropertyNamingPolicy = CosmosPropertyNamingPolicy.CamelCase
                });
                if (isGatewayMode)
                {
                    action.WithConnectionModeGateway();
                }
            };
            CosmosClient camelCaseCosmosClient = TestCommon.CreateCosmosClient(builder, false);

            Cosmos.Database      database = camelCaseCosmosClient.GetDatabase(this.database.Id);
            Container            containerFromCamelCaseClient = database.GetContainer(this.Container.Id);
            IList <ToDoActivity> itemList = await ToDoActivity.CreateRandomItems(container : containerFromCamelCaseClient, pkCount : 2, perPKItemCount : 1, randomPartitionKey : true);

            //Testing query without camelCase CosmosSerializationOptions using this.Container, should not return any result
            IOrderedQueryable <ToDoActivity> linqQueryable = this.Container.GetItemLinqQueryable <ToDoActivity>(true);
            IQueryable <ToDoActivity>        queriable     = linqQueryable.Where(item => item.CamelCase == "camelCase");
            string queryText = queriable.ToQueryDefinition().QueryText;

            Assert.AreEqual(queriable.Count(), 0);

            //Testing query with camelCase CosmosSerializationOptions using containerFromCamelCaseClient, should return all the items
            linqQueryable = containerFromCamelCaseClient.GetItemLinqQueryable <ToDoActivity>(true);
            queriable     = linqQueryable.Where(item => item.CamelCase == "camelCase");
            queryText     = queriable.ToQueryDefinition().QueryText;
            Assert.AreEqual(queriable.Count(), 2);
        }
コード例 #3
0
        public async Task QueryOperationMutiplePageCrossPartitionTest(ConnectionMode mode)
        {
            Environment.SetEnvironmentVariable(ClientTelemetryOptions.EnvPropsClientTelemetrySchedulingInSeconds, "20");

            ContainerInternal itemsCore = (ContainerInternal)await this.CreateClientAndContainer(
                mode : mode,
                isLargeContainer : true);

            // Verify container has multiple partitions
            int pkRangesCount = (await itemsCore.ClientContext.DocumentClient.ReadPartitionKeyRangeFeedAsync(itemsCore.LinkUri)).Count;

            Assert.IsTrue(pkRangesCount > 1, "Should have created a multi partition container.");

            Container container = (Container)itemsCore;

            await ToDoActivity.CreateRandomItems(
                container : container,
                pkCount : 2,
                perPKItemCount : 5);

            string sqlQueryText = "SELECT * FROM c";

            List <object>   families        = new List <object>();
            QueryDefinition queryDefinition = new QueryDefinition(sqlQueryText);

            using (FeedIterator <object> queryResultSetIterator = container.GetItemQueryIterator <object>(
                       queryDefinition: queryDefinition,
                       requestOptions: new QueryRequestOptions()
            {
                MaxItemCount = 1
            }))
            {
                while (queryResultSetIterator.HasMoreResults)
                {
                    FeedResponse <object> currentResultSet = await queryResultSetIterator.ReadNextAsync();

                    foreach (object family in currentResultSet)
                    {
                        families.Add(family);
                    }
                }
            }

            Assert.AreEqual(10, families.Count);

            IDictionary <string, long> expectedRecordCountInOperation = new Dictionary <string, long>
            {
                { Documents.OperationType.Query.ToString(), pkRangesCount + 10 }, // 10 is number of items
                { Documents.OperationType.Create.ToString(), 10 }
            };

            await this.WaitAndAssert(
                expectedOperationCount : 4,
                expectedOperationRecordCountMap : expectedRecordCountInOperation);
        }
コード例 #4
0
        public async Task ItemLINQQueryWithContinuationTokenTest()
        {
            //Creating items for query.
            IList <ToDoActivity> itemList = await ToDoActivity.CreateRandomItems(container : this.Container, pkCount : 10, perPKItemCount : 1, randomPartitionKey : true);

            QueryRequestOptions queryRequestOptions = new QueryRequestOptions();

            queryRequestOptions.MaxConcurrency = 1;
            queryRequestOptions.MaxItemCount   = 5;
            IOrderedQueryable <ToDoActivity> linqQueryable = this.Container.GetItemLinqQueryable <ToDoActivity>(requestOptions: queryRequestOptions);
            IQueryable <ToDoActivity>        queriable     = linqQueryable.Where(item => (item.taskNum < 100));
            FeedIterator <ToDoActivity>      feedIterator  = queriable.ToFeedIterator();

            int    firstItemSet      = 0;
            string continuationToken = null;

            while (feedIterator.HasMoreResults)
            {
                FeedResponse <ToDoActivity> feedResponse = await feedIterator.ReadNextAsync();

                firstItemSet      = feedResponse.Count();
                continuationToken = feedResponse.ContinuationToken;
                if (firstItemSet > 0)
                {
                    break;
                }
            }

            linqQueryable = this.Container.GetItemLinqQueryable <ToDoActivity>(continuationToken: continuationToken, requestOptions: queryRequestOptions);
            queriable     = linqQueryable.Where(item => (item.taskNum < 100));
            feedIterator  = queriable.ToFeedIterator();

            //Test continuationToken with LINQ query generation and asynchronous feedIterator execution.
            int secondItemSet = 0;

            while (feedIterator.HasMoreResults)
            {
                FeedResponse <ToDoActivity> feedResponse = await feedIterator.ReadNextAsync();

                secondItemSet += feedResponse.Count();
            }

            Assert.AreEqual(10 - firstItemSet, secondItemSet);

            //Test continuationToken with blocking LINQ execution
            linqQueryable = this.Container.GetItemLinqQueryable <ToDoActivity>(allowSynchronousQueryExecution: true, continuationToken: continuationToken, requestOptions: queryRequestOptions);
            int linqExecutionItemCount = linqQueryable.Where(item => (item.taskNum < 100)).Count();

            Assert.AreEqual(10 - firstItemSet, linqExecutionItemCount);
        }
コード例 #5
0
        public async Task GatewayQueryPlanDiagnostic()
        {
            int totalItems = 3;
            IList <ToDoActivity> itemList = await ToDoActivity.CreateRandomItems(
                this.Container,
                pkCount : totalItems,
                perPKItemCount : 1,
                randomPartitionKey : true);

            ContainerInternal     containerCore          = (ContainerInlineCore)this.Container;
            MockCosmosQueryClient gatewayQueryPlanClient = new MockCosmosQueryClient(
                clientContext: containerCore.ClientContext,
                cosmosContainerCore: containerCore,
                forceQueryPlanGatewayElseServiceInterop: true);

            Container gatewayQueryPlanContainer = new ContainerInlineCore(
                containerCore.ClientContext,
                (DatabaseInternal)containerCore.Database,
                containerCore.Id,
                gatewayQueryPlanClient);

            QueryRequestOptions queryRequestOptions = new QueryRequestOptions()
            {
                MaxItemCount         = 1,
                MaxBufferedItemCount = 0
            };

            FeedIterator <ToDoActivity> feedIterator = gatewayQueryPlanContainer.GetItemQueryIterator <ToDoActivity>(
                "select * from ToDoActivity t ORDER BY t.cost",
                requestOptions: queryRequestOptions);

            List <ToDoActivity> results = new List <ToDoActivity>();
            bool isFirstPage            = true;

            while (feedIterator.HasMoreResults)
            {
                FeedResponse <ToDoActivity> response = await feedIterator.ReadNextAsync();

                results.AddRange(response);
                CosmosDiagnosticsContext diagnosticsContext = (response.Diagnostics as CosmosDiagnosticsCore).Context;
                DiagnosticValidator.ValidateQueryGatewayPlanDiagnostics(diagnosticsContext, isFirstPage);
                isFirstPage = false;
            }
        }
コード例 #6
0
        public async Task LinqCaseInsensitiveStringTest()
        {
            //Creating items for query.
            IList <ToDoActivity> itemList = await ToDoActivity.CreateRandomItems(container : this.Container, pkCount : 2, perPKItemCount : 100, randomPartitionKey : true);

            IOrderedQueryable <ToDoActivity> linqQueryable = this.Container.GetItemLinqQueryable <ToDoActivity>();

            async Task TestSearch(Expression <Func <ToDoActivity, bool> > expression, string expectedMethod, bool caseInsensitive, int expectedResults)
            {
                string expectedQueryText = $"SELECT VALUE root FROM root WHERE {expectedMethod}(root[\"description\"], @param1{(caseInsensitive ? ", true" : "")})";

                IArgumentProvider arguments = (IArgumentProvider)expression.Body;

                string searchString = (arguments.GetArgument(0) as ConstantExpression).Value as string;

                IQueryable <ToDoActivity> queryable = linqQueryable.Where(expression);

                Dictionary <object, string> parameters = new Dictionary <object, string>();

                parameters.Add(searchString, "@param1");

                QueryDefinition queryDefinition = queryable.ToQueryDefinition(parameters);

                string queryText = queryDefinition.ToSqlQuerySpec().QueryText;

                Assert.AreEqual(expectedQueryText, queryText);

                Assert.AreEqual(expectedResults, await queryable.CountAsync());
            }

            await TestSearch(x => x.description.StartsWith("create"), "STARTSWITH", false, 0);
            await TestSearch(x => x.description.StartsWith("cReAtE", StringComparison.OrdinalIgnoreCase), "STARTSWITH", true, 200);

            await TestSearch(x => x.description.EndsWith("activity"), "ENDSWITH", false, 0);
            await TestSearch(x => x.description.EndsWith("AcTiViTy", StringComparison.OrdinalIgnoreCase), "ENDSWITH", true, 200);

            await TestSearch(x => x.description.Equals("createrandomtodoactivity", StringComparison.OrdinalIgnoreCase), "STRINGEQUALS", true, 200);

            await TestSearch(x => x.description.Contains("todo"), "CONTAINS", false, 0);
            await TestSearch(x => x.description.Contains("tOdO", StringComparison.OrdinalIgnoreCase), "CONTAINS", true, 200);
        }
コード例 #7
0
        public async Task ItemLinqReadFeedTest(bool useStatelessIterator)
        {
            IList <ToDoActivity> deleteList = await ToDoActivity.CreateRandomItems(this.Container, pkCount : 3, randomPartitionKey : true);

            HashSet <string> itemIds = deleteList.Select(x => x.id).ToHashSet <string>();

            QueryRequestOptions requestOptions = new QueryRequestOptions()
            {
                MaxItemCount = 1
            };

            List <ToDoActivity> itemsViaReadFeed = this.Container.GetItemLinqQueryable <ToDoActivity>(
                allowSynchronousQueryExecution: true,
                requestOptions: requestOptions).ToList();

            Assert.IsTrue(itemsViaReadFeed.Count >= 3);
            CollectionAssert.AreEqual(deleteList.ToList(), itemsViaReadFeed);

            string lastContinuationToken             = null;
            FeedIterator <ToDoActivity> feedIterator = this.Container.GetItemLinqQueryable <ToDoActivity>(
                requestOptions: requestOptions).ToFeedIterator();

            while (feedIterator.HasMoreResults)
            {
                if (useStatelessIterator)
                {
                    feedIterator = this.Container.GetItemLinqQueryable <ToDoActivity>(
                        continuationToken: lastContinuationToken,
                        requestOptions: requestOptions).ToFeedIterator();
                }

                FeedResponse <ToDoActivity> responseMessage = await feedIterator.ReadNextAsync(this.cancellationToken);

                lastContinuationToken = responseMessage.ContinuationToken;

                foreach (ToDoActivity toDoActivity in responseMessage)
                {
                    if (itemIds.Contains(toDoActivity.id))
                    {
                        itemIds.Remove(toDoActivity.id);
                    }
                }
            }

            Assert.IsNull(lastContinuationToken);
            Assert.AreEqual(itemIds.Count, 0);

            itemIds = deleteList.Select(x => x.id).ToHashSet <string>();
            FeedIterator streamIterator = this.Container.GetItemLinqQueryable <ToDoActivity>(
                requestOptions: requestOptions).ToStreamIterator();

            while (streamIterator.HasMoreResults)
            {
                if (useStatelessIterator)
                {
                    streamIterator = this.Container.GetItemLinqQueryable <ToDoActivity>(
                        continuationToken: lastContinuationToken,
                        requestOptions: requestOptions).ToStreamIterator();
                }

                using (ResponseMessage responseMessage = await streamIterator.ReadNextAsync(this.cancellationToken))
                {
                    lastContinuationToken = responseMessage.Headers.ContinuationToken;

                    Collection <ToDoActivity> items = TestCommon.SerializerCore.FromStream <CosmosFeedResponseUtil <ToDoActivity> >(responseMessage.Content).Data;
                    foreach (ToDoActivity toDoActivity in items)
                    {
                        if (itemIds.Contains(toDoActivity.id))
                        {
                            itemIds.Remove(toDoActivity.id);
                        }
                    }
                }
            }

            Assert.IsNull(lastContinuationToken);
            Assert.AreEqual(itemIds.Count, 0);
        }
コード例 #8
0
        public async Task QueryableExtentionFunctionsTest()
        {
            //Creating items for query.
            IList <ToDoActivity> itemList = await ToDoActivity.CreateRandomItems(container : this.Container, pkCount : 10, perPKItemCount : 1, randomPartitionKey : true);

            QueryRequestOptions queryRequestOptions        = new QueryRequestOptions();
            IOrderedQueryable <ToDoActivity> linqQueryable = this.Container.GetItemLinqQueryable <ToDoActivity>(
                requestOptions: queryRequestOptions);

            int count = await linqQueryable.CountAsync();

            Assert.AreEqual(10, count);

            Response <int> intSum = await linqQueryable.Select(item => item.taskNum).SumAsync();

            this.VerifyResponse(intSum, 420, queryRequestOptions);

            Response <int?> intNullableSum = await linqQueryable.Select(item => (int?)item.taskNum).SumAsync();

            this.VerifyResponse(intNullableSum, 420, queryRequestOptions);

            Response <float> floatSum = await linqQueryable.Select(item => (float)item.taskNum).SumAsync();

            this.VerifyResponse(floatSum, 420, queryRequestOptions);

            Response <float?> floatNullableSum = await linqQueryable.Select(item => (float?)item.taskNum).SumAsync();

            this.VerifyResponse(floatNullableSum, 420, queryRequestOptions);

            Response <double> doubleSum = await linqQueryable.Select(item => (double)item.taskNum).SumAsync();

            this.VerifyResponse(doubleSum, 420, queryRequestOptions);

            Response <double?> doubleNullableSum = await linqQueryable.Select(item => (double?)item.taskNum).SumAsync();

            this.VerifyResponse(doubleNullableSum, 420, queryRequestOptions);

            Response <long> longSum = await linqQueryable.Select(item => (long)item.taskNum).SumAsync();

            this.VerifyResponse(longSum, 420, queryRequestOptions);

            Response <long?> longNullableSum = await linqQueryable.Select(item => (long?)item.taskNum).SumAsync();

            this.VerifyResponse(longNullableSum, 420, queryRequestOptions);

            Response <decimal> decimalSum = await linqQueryable.Select(item => (decimal)item.taskNum).SumAsync();

            this.VerifyResponse(decimalSum, 420, queryRequestOptions);

            Response <decimal?> decimalNullableSum = await linqQueryable.Select(item => (decimal?)item.taskNum).SumAsync();

            this.VerifyResponse(decimalNullableSum, 420, queryRequestOptions);

            Response <double> intToDoubleAvg = await linqQueryable.Select(item => item.taskNum).AverageAsync();

            this.VerifyResponse(intToDoubleAvg, 42, queryRequestOptions);

            Response <double?> intToDoubleNulableAvg = await linqQueryable.Select(item => (double?)item.taskNum).AverageAsync();

            this.VerifyResponse(intToDoubleNulableAvg, 42, queryRequestOptions);

            Response <float> floatAvg = await linqQueryable.Select(item => (float)item.taskNum).AverageAsync();

            this.VerifyResponse(floatAvg, 42, queryRequestOptions);

            Response <float?> floatNullableAvg = await linqQueryable.Select(item => (float?)item.taskNum).AverageAsync();

            this.VerifyResponse(floatNullableAvg, 42, queryRequestOptions);

            Response <double> doubleAvg = await linqQueryable.Select(item => (double)item.taskNum).AverageAsync();

            this.VerifyResponse(doubleAvg, 42, queryRequestOptions);

            Response <double?> doubleNullableAvg = await linqQueryable.Select(item => (double?)item.taskNum).AverageAsync();

            this.VerifyResponse(doubleNullableAvg, 42, queryRequestOptions);

            Response <double> longToDoubleAvg = await linqQueryable.Select(item => (long)item.taskNum).AverageAsync();

            this.VerifyResponse(longToDoubleAvg, 42, queryRequestOptions);

            Response <double?> longToNullableDoubleAvg = await linqQueryable.Select(item => (long?)item.taskNum).AverageAsync();

            this.VerifyResponse(longToNullableDoubleAvg, 42, queryRequestOptions);

            Response <decimal> decimalAvg = await linqQueryable.Select(item => (decimal)item.taskNum).AverageAsync();

            this.VerifyResponse(decimalAvg, 42, queryRequestOptions);

            Response <decimal?> decimalNullableAvg = await linqQueryable.Select(item => (decimal?)item.taskNum).AverageAsync();

            this.VerifyResponse(decimalNullableAvg, 42, queryRequestOptions);

            //Adding more items to test min and max function
            ToDoActivity toDoActivity = ToDoActivity.CreateRandomToDoActivity();

            toDoActivity.taskNum = 20;
            toDoActivity.id      = "minTaskNum";
            await this.Container.CreateItemAsync(toDoActivity, new PartitionKey(toDoActivity.pk));

            toDoActivity.taskNum = 100;
            toDoActivity.id      = "maxTaskNum";
            await this.Container.CreateItemAsync(toDoActivity, new PartitionKey(toDoActivity.pk));

            Response <int> minTaskNum = await linqQueryable.Select(item => item.taskNum).MinAsync();

            Assert.AreEqual(20, minTaskNum);

            Response <int> maxTaskNum = await linqQueryable.Select(item => item.taskNum).MaxAsync();

            Assert.AreEqual(100, maxTaskNum);
        }
コード例 #9
0
        public async Task ItemLINQQueryWithContinuationTokenTest()
        {
            // Creating items for query.
            IList <ToDoActivity> itemList = await ToDoActivity.CreateRandomItems(
                container : this.Container,
                pkCount : 10,
                perPKItemCount : 1,
                randomPartitionKey : true);

            IList <ToDoActivity> filteredList = itemList.Where(item => item.taskNum < 100).ToList();
            int filteredDocumentCount         = filteredList.Count();

            Console.WriteLine($"Filtered List: {JsonConvert.SerializeObject(filteredList)}.");

            QueryRequestOptions queryRequestOptions = new QueryRequestOptions();

            queryRequestOptions.MaxConcurrency = 1;
            queryRequestOptions.MaxItemCount   = 5;
            IOrderedQueryable <ToDoActivity> linqQueryable = this.Container.GetItemLinqQueryable <ToDoActivity>(requestOptions: queryRequestOptions);
            IQueryable <ToDoActivity>        queriable     = linqQueryable.Where(item => item.taskNum < 100);
            FeedIterator <ToDoActivity>      feedIterator  = queriable.ToFeedIterator();

            int    firstItemSet      = 0;
            string continuationToken = null;

            while (feedIterator.HasMoreResults)
            {
                FeedResponse <ToDoActivity> feedResponse = await feedIterator.ReadNextAsync();

                firstItemSet      = feedResponse.Count();
                continuationToken = feedResponse.ContinuationToken;
                Console.WriteLine($"First page: {JsonConvert.SerializeObject(feedResponse.Resource)}.");
                if (firstItemSet > 0)
                {
                    break;
                }
            }

            linqQueryable = this.Container.GetItemLinqQueryable <ToDoActivity>(
                continuationToken: continuationToken,
                requestOptions: queryRequestOptions);
            queriable    = linqQueryable.Where(item => item.taskNum < 100);
            feedIterator = queriable.ToFeedIterator();

            // Test continuationToken with LINQ query generation and asynchronous feedIterator execution.
            int secondItemSet = 0;

            while (feedIterator.HasMoreResults)
            {
                FeedResponse <ToDoActivity> feedResponse = await feedIterator.ReadNextAsync();

                secondItemSet += feedResponse.Count();
                Console.WriteLine($"Second Async page: {JsonConvert.SerializeObject(feedResponse.Resource)}.");
            }

            Assert.AreEqual(
                filteredDocumentCount - firstItemSet,
                secondItemSet,
                "Failed to resume execution for async iterator.");

            // Test continuationToken with blocking LINQ execution
            linqQueryable = this.Container.GetItemLinqQueryable <ToDoActivity>(
                allowSynchronousQueryExecution: true,
                continuationToken: continuationToken,
                requestOptions: queryRequestOptions);
            List <ToDoActivity> secondSyncPage = linqQueryable.Where(item => item.taskNum < 100).ToList();

            Console.WriteLine($"Second Sync page: {JsonConvert.SerializeObject(secondSyncPage)}.");
            int linqExecutionItemCount = secondSyncPage.Count();

            Assert.AreEqual(
                filteredDocumentCount - firstItemSet,
                linqExecutionItemCount,
                "Failed to resume execution for sync iterator");
        }
コード例 #10
0
        public async Task ItemLINQQueryTest()
        {
            //Creating items for query.
            IList <ToDoActivity> itemList = await ToDoActivity.CreateRandomItems(container : this.Container, pkCount : 2, perPKItemCount : 1, randomPartitionKey : true);

            IOrderedQueryable <ToDoActivity> linqQueryable = this.Container.GetItemLinqQueryable <ToDoActivity>();
            IQueryable <ToDoActivity>        queriable     = linqQueryable.Where(item => item.taskNum < 100);
            //V3 Asynchronous query execution with LINQ query generation sql text.
            FeedIterator <ToDoActivity> setIterator = this.Container.GetItemQueryIterator <ToDoActivity>(
                queriable.ToQueryDefinition(),
                requestOptions: new QueryRequestOptions()
            {
                MaxConcurrency = 2
            });

            int resultsFetched = 0;

            while (setIterator.HasMoreResults)
            {
                FeedResponse <ToDoActivity> queryResponse = await setIterator.ReadNextAsync();

                resultsFetched += queryResponse.Count();

                // For the items returned with NonePartitionKeyValue
                IEnumerator <ToDoActivity> iter = queryResponse.GetEnumerator();
                while (iter.MoveNext())
                {
                    ToDoActivity activity = iter.Current;
                    Assert.AreEqual(42, activity.taskNum);
                }
                Assert.AreEqual(2, resultsFetched);
            }

            //LINQ query execution without partition key.
            linqQueryable = this.Container.GetItemLinqQueryable <ToDoActivity>(allowSynchronousQueryExecution: true);
            queriable     = linqQueryable.Where(item => item.taskNum < 100);

            Assert.AreEqual(2, queriable.Count());
            Assert.AreEqual(itemList[0].id, queriable.ToList()[0].id);
            Assert.AreEqual(itemList[1].id, queriable.ToList()[1].id);

            //LINQ query execution with wrong partition key.
            linqQueryable = this.Container.GetItemLinqQueryable <ToDoActivity>(
                allowSynchronousQueryExecution: true,
                requestOptions: new QueryRequestOptions()
            {
                PartitionKey = new Cosmos.PartitionKey("test")
            });
            queriable = linqQueryable.Where(item => item.taskNum < 100);
            Assert.AreEqual(0, queriable.Count());

            //LINQ query execution with correct partition key.
            linqQueryable = this.Container.GetItemLinqQueryable <ToDoActivity>(
                allowSynchronousQueryExecution: true,
                requestOptions: new QueryRequestOptions {
                ConsistencyLevel = Cosmos.ConsistencyLevel.Eventual, PartitionKey = new Cosmos.PartitionKey(itemList[1].pk)
            });
            queriable = linqQueryable.Where(item => item.taskNum < 100);
            Assert.AreEqual(1, queriable.Count());
            Assert.AreEqual(itemList[1].id, queriable.ToList()[0].id);
        }
コード例 #11
0
        public async Task LinqParameterisedTest2()
        {
            //Creating items for query.
            IList <ToDoActivity> itemList = await ToDoActivity.CreateRandomItems(container : this.Container, pkCount : 10, perPKItemCount : 1, randomPartitionKey : true);

            IOrderedQueryable <ToDoActivity> linqQueryable = this.Container.GetItemLinqQueryable <ToDoActivity>(true);

            //Test same values in two where clause
            string camelCase = "wrongValue";
            IQueryable <ToDoActivity> queriable = linqQueryable
                                                  .Where(item => item.CamelCase == camelCase)
                                                  .Where(item => item.description != camelCase);
            Dictionary <object, string> parameters = new Dictionary <object, string>();

            parameters.Add(camelCase, "@param1");
            QueryDefinition queryDefinition = queriable.ToQueryDefinition(parameters);

            Assert.AreEqual(1, queryDefinition.ToSqlQuerySpec().Parameters.Count);
            Assert.AreEqual(0, (await this.FetchResults <ToDoActivity>(queryDefinition)).Count);

            camelCase = "camelCase";
            queryDefinition.WithParameter("@param1", camelCase);
            Assert.AreEqual(10, (await this.FetchResults <ToDoActivity>(queryDefinition)).Count);

            string queryText = "SELECT VALUE root FROM root WHERE (root[\"children\"] = [@param1, @param2])";
            //Test array in query, array items will be parametrized
            ToDoActivity child1 = new ToDoActivity {
                id = "child1", taskNum = 30
            };
            ToDoActivity child2 = new ToDoActivity {
                id = "child2", taskNum = 40
            };

            ToDoActivity[] children = new ToDoActivity[]
            { child1,
              child2 };
            queriable = linqQueryable
                        .Where(item => item.children == children);
            parameters = new Dictionary <object, string>();
            parameters.Add(child1, "@param1");
            parameters.Add(child2, "@param2");
            queryDefinition = queriable.ToQueryDefinition(parameters);
            Assert.AreEqual(queryText, queryDefinition.ToSqlQuerySpec().QueryText);
            Assert.AreEqual(10, (await this.FetchResults <ToDoActivity>(queryDefinition)).Count);

            //updating child to wrong value, result in query returning 0 results
            child1.taskNum = 50;
            queryDefinition.WithParameter("@param1", child1);
            Assert.AreEqual(queryText, queryDefinition.ToSqlQuerySpec().QueryText);
            Assert.AreEqual(0, (await this.FetchResults <ToDoActivity>(queryDefinition)).Count);

            //Test orderby, skip, take, distinct, these will not get parameterized.
            queryText = "SELECT VALUE root FROM root WHERE (root[\"CamelCase\"] = @param1) ORDER BY" +
                        " root[\"taskNum\"] ASC OFFSET @param2 LIMIT @param3";
            queriable = linqQueryable
                        .Where(item => item.CamelCase == camelCase)
                        .OrderBy(item => item.taskNum)
                        .Skip(5)
                        .Take(4);
            parameters = new Dictionary <object, string>();
            parameters.Add(camelCase, "@param1");
            parameters.Add(5, "@param2");
            parameters.Add(4, "@param3");
            queryDefinition = queriable.ToQueryDefinition(parameters);
            Assert.AreEqual(queryText, queryDefinition.ToSqlQuerySpec().QueryText);
            Assert.AreEqual(4, (await this.FetchResults <ToDoActivity>(queryDefinition)).Count);

            queryDefinition.WithParameter("@param2", 10);
            queryDefinition.WithParameter("@param3", 0);
            Assert.AreEqual(0, (await this.FetchResults <ToDoActivity>(queryDefinition)).Count);


            queryText = "SELECT VALUE root FROM root WHERE (root[\"CamelCase\"] != @param1)";
            camelCase = "\b\n";
            queriable = linqQueryable
                        .Where(item => item.CamelCase != camelCase);
            parameters = new Dictionary <object, string>();
            parameters.Add(camelCase, "@param1");
            queryDefinition = queriable.ToQueryDefinition(parameters);
            Assert.AreEqual("\b\n", queryDefinition.ToSqlQuerySpec().Parameters[0].Value);
            Assert.AreEqual(queryText, queryDefinition.ToSqlQuerySpec().QueryText);
            Assert.AreEqual(10, (await this.FetchResults <ToDoActivity>(queryDefinition)).Count);
        }
コード例 #12
0
        public async Task LinqParameterisedTest1()
        {
            //Creating items for query.
            IList <ToDoActivity> itemList = await ToDoActivity.CreateRandomItems(container : this.Container, pkCount : 10, perPKItemCount : 1, randomPartitionKey : true);

            string queryText = "SELECT VALUE item0 FROM root JOIN item0 IN root[\"children\"] WHERE (((((root[\"CamelCase\"] = @param1)" +
                               " AND (root[\"description\"] = @param2)) AND (root[\"taskNum\"] < @param3))" +
                               " AND (root[\"valid\"] = @param4)) AND (item0 = @param5))";
            ToDoActivity child1 = new ToDoActivity {
                id = "child1", taskNum = 30
            };
            string description = "CreateRandomToDoActivity";
            string camelCase   = "camelCase";
            int    taskNum     = 100;
            bool   valid       = true;


            // Passing incorrect boolean value, generating queryDefinition, updating parameter and verifying new result
            valid = false;
            IOrderedQueryable <ToDoActivity> linqQueryable = this.Container.GetItemLinqQueryable <ToDoActivity>(true);
            IQueryable <ToDoActivity>        queriable     = linqQueryable.Where(item => item.CamelCase == camelCase)
                                                             .Where(item => item.description == description)
                                                             .Where(item => item.taskNum < taskNum)
                                                             .Where(item => item.valid == valid)
                                                             .SelectMany(item => item.children)
                                                             .Where(child => child == child1);
            Dictionary <object, string> parameters = new Dictionary <object, string>();

            parameters.Add(camelCase, "@param1");
            parameters.Add(description, "@param2");
            parameters.Add(taskNum, "@param3");
            parameters.Add(valid, "@param4");
            parameters.Add(child1, "@param5");
            QueryDefinition queryDefinition = queriable.ToQueryDefinition(parameters);

            Assert.AreEqual(5, queryDefinition.ToSqlQuerySpec().Parameters.Count);
            Assert.AreEqual(queryText, queryDefinition.ToSqlQuerySpec().QueryText);
            Assert.AreEqual(0, (await this.FetchResults <ToDoActivity>(queryDefinition)).Count);

            string paramNameForUpdate = parameters[valid];

            valid = true;
            queryDefinition.WithParameter(paramNameForUpdate, valid);
            Assert.AreEqual(10, (await this.FetchResults <ToDoActivity>(queryDefinition)).Count);

            // Passing incorrect string value, generating queryDefinition, updating parameter and verifying new result
            description   = "wrongDescription";
            linqQueryable = this.Container.GetItemLinqQueryable <ToDoActivity>(true);
            queriable     = linqQueryable.Where(item => item.CamelCase == "camelCase")
                            .Where(item => item.description == description)
                            .Where(item => item.taskNum < 100)
                            .Where(item => item.valid == true)
                            .SelectMany(item => item.children)
                            .Where(child => child == child1);
            parameters = new Dictionary <object, string>();
            parameters.Add(camelCase, "@param1");
            parameters.Add(description, "@param2");
            parameters.Add(taskNum, "@param3");
            parameters.Add(valid, "@param4");
            parameters.Add(child1, "@param5");
            queryDefinition = queriable.ToQueryDefinition(parameters);
            Assert.AreEqual(5, queryDefinition.ToSqlQuerySpec().Parameters.Count);
            Assert.AreEqual(queryText, queryDefinition.ToSqlQuerySpec().QueryText);
            Assert.AreEqual(0, (await this.FetchResults <ToDoActivity>(queryDefinition)).Count);

            paramNameForUpdate = parameters[description];
            description        = "CreateRandomToDoActivity";
            queryDefinition.WithParameter(paramNameForUpdate, description);
            Assert.AreEqual(10, (await this.FetchResults <ToDoActivity>(queryDefinition)).Count);

            // Passing incorrect number value, generating queryDefinition, updating parameter and verifying new result
            taskNum       = 10;
            linqQueryable = this.Container.GetItemLinqQueryable <ToDoActivity>(true);
            queriable     = linqQueryable.Where(item => item.CamelCase == "camelCase")
                            .Where(item => item.description == "CreateRandomToDoActivity")
                            .Where(item => item.taskNum < taskNum)
                            .Where(item => item.valid == true)
                            .SelectMany(item => item.children)
                            .Where(child => child == child1);
            parameters = new Dictionary <object, string>();
            parameters.Add(camelCase, "@param1");
            parameters.Add(description, "@param2");
            parameters.Add(taskNum, "@param3");
            parameters.Add(valid, "@param4");
            parameters.Add(child1, "@param5");
            queryDefinition = queriable.ToQueryDefinition(parameters);
            Assert.AreEqual(5, queryDefinition.ToSqlQuerySpec().Parameters.Count);
            Assert.AreEqual(queryText, queryDefinition.ToSqlQuerySpec().QueryText);
            Assert.AreEqual(0, (await this.FetchResults <ToDoActivity>(queryDefinition)).Count);

            paramNameForUpdate = parameters[taskNum];
            taskNum            = 100;
            queryDefinition.WithParameter(paramNameForUpdate, taskNum);
            Assert.AreEqual(10, (await this.FetchResults <ToDoActivity>(queryDefinition)).Count);

            // Passing incorrect object value, generating queryDefinition, updating parameter and verifying new result
            child1.taskNum = 40;
            queriable      = linqQueryable.Where(item => item.CamelCase == "camelCase")
                             .Where(item => item.description == "CreateRandomToDoActivity")
                             .Where(item => item.taskNum < taskNum)
                             .Where(item => item.valid == true)
                             .SelectMany(item => item.children)
                             .Where(child => child == child1);
            parameters = new Dictionary <object, string>();
            parameters.Add(camelCase, "@param1");
            parameters.Add(description, "@param2");
            parameters.Add(taskNum, "@param3");
            parameters.Add(valid, "@param4");
            parameters.Add(child1, "@param5");
            queryDefinition = queriable.ToQueryDefinition(parameters);
            Assert.AreEqual(5, queryDefinition.ToSqlQuerySpec().Parameters.Count);
            Assert.AreEqual(queryText, queryDefinition.ToSqlQuerySpec().QueryText);
            Assert.AreEqual(0, (await this.FetchResults <ToDoActivity>(queryDefinition)).Count);

            paramNameForUpdate = parameters[child1];
            child1.taskNum     = 30;
            queryDefinition.WithParameter(paramNameForUpdate, child1);
            Assert.AreEqual(10, (await this.FetchResults <ToDoActivity>(queryDefinition)).Count);
        }
コード例 #13
0
        public async Task QueryableExtentionFunctionsTest()
        {
            //Creating items for query.
            IList <ToDoActivity> itemList = await ToDoActivity.CreateRandomItems(container : this.Container, pkCount : 10, perPKItemCount : 1, randomPartitionKey : true);

            IOrderedQueryable <ToDoActivity> linqQueryable = this.Container.GetItemLinqQueryable <ToDoActivity>();

            int count = await linqQueryable.CountAsync();

            Assert.AreEqual(10, count);

            Response <int> intSum = await linqQueryable.Select(item => item.taskNum).SumAsync();

            Assert.AreEqual(420, intSum.Resource);
            Assert.IsTrue(intSum.RequestCharge > 0);
            string diagnostics = intSum.Diagnostics.ToString();

            Assert.IsTrue(diagnostics.Contains("queryMetrics"));

            Response <int?> intNullableSum = await linqQueryable.Select(item => (int?)item.taskNum).SumAsync();

            Assert.AreEqual <int?>(420, intNullableSum);
            Assert.IsTrue(intNullableSum.RequestCharge > 0);
            diagnostics = intNullableSum.Diagnostics.ToString();
            Assert.IsTrue(diagnostics.Contains("queryMetrics"));

            Response <float> floatSum = await linqQueryable.Select(item => (float)item.taskNum).SumAsync();

            Assert.AreEqual(420, intSum);
            Assert.IsTrue(floatSum.RequestCharge > 0);
            diagnostics = floatSum.Diagnostics.ToString();
            Assert.IsTrue(diagnostics.Contains("queryMetrics"));

            Response <float?> floatNullableSum = await linqQueryable.Select(item => (float?)item.taskNum).SumAsync();

            Assert.AreEqual <float?>(420, intNullableSum);
            Assert.IsTrue(intSum.RequestCharge > 0);
            diagnostics = intSum.Diagnostics.ToString();
            Assert.IsTrue(diagnostics.Contains("queryMetrics"));

            Response <double> doubleSum = await linqQueryable.Select(item => (double)item.taskNum).SumAsync();

            Assert.AreEqual(420.0, doubleSum);
            Assert.IsTrue(intSum.RequestCharge > 0);
            diagnostics = intSum.Diagnostics.ToString();
            Assert.IsTrue(diagnostics.Contains("queryMetrics"));

            Response <double?> doubleNullableSum = await linqQueryable.Select(item => (double?)item.taskNum).SumAsync();

            Assert.AreEqual <double?>(420.0, doubleNullableSum);
            Assert.IsTrue(intSum.RequestCharge > 0);
            diagnostics = intSum.Diagnostics.ToString();
            Assert.IsTrue(diagnostics.Contains("queryMetrics"));

            Response <long> longSum = await linqQueryable.Select(item => (long)item.taskNum).SumAsync();

            Assert.AreEqual <long>(420, longSum);
            Assert.IsTrue(intSum.RequestCharge > 0);
            diagnostics = intSum.Diagnostics.ToString();
            Assert.IsTrue(diagnostics.Contains("queryMetrics"));

            Response <long?> longNullableSum = await linqQueryable.Select(item => (long?)item.taskNum).SumAsync();

            Assert.AreEqual <long?>(420, longNullableSum);
            Assert.IsTrue(intSum.RequestCharge > 0);
            diagnostics = intSum.Diagnostics.ToString();
            Assert.IsTrue(diagnostics.Contains("queryMetrics"));

            Response <decimal> decimalSum = await linqQueryable.Select(item => (decimal)item.taskNum).SumAsync();

            Assert.AreEqual <decimal>(420, decimalSum);
            Assert.IsTrue(intSum.RequestCharge > 0);
            diagnostics = intSum.Diagnostics.ToString();
            Assert.IsTrue(diagnostics.Contains("queryMetrics"));

            Response <decimal?> decimalNullableSum = await linqQueryable.Select(item => (decimal?)item.taskNum).SumAsync();

            Assert.AreEqual <decimal?>(420, decimalNullableSum);
            Assert.IsTrue(intSum.RequestCharge > 0);
            diagnostics = intSum.Diagnostics.ToString();
            Assert.IsTrue(diagnostics.Contains("queryMetrics"));

            Response <double> intToDoubleAvg = await linqQueryable.Select(item => item.taskNum).AverageAsync();

            Assert.AreEqual <double>(42, intToDoubleAvg);
            Assert.IsTrue(intSum.RequestCharge > 0);
            diagnostics = intSum.Diagnostics.ToString();
            Assert.IsTrue(diagnostics.Contains("queryMetrics"));

            Response <double?> intToDoubleNulableAvg = await linqQueryable.Select(item => (double?)item.taskNum).AverageAsync();

            Assert.AreEqual <double?>(42, intToDoubleNulableAvg);
            Assert.IsTrue(intToDoubleNulableAvg.RequestCharge > 0);
            diagnostics = intToDoubleNulableAvg.Diagnostics.ToString();
            Assert.IsTrue(diagnostics.Contains("queryMetrics"));

            Response <float> floatAvg = await linqQueryable.Select(item => (float)item.taskNum).AverageAsync();

            Assert.AreEqual <float>(42, floatAvg);
            Assert.IsTrue(floatAvg.RequestCharge > 0);
            diagnostics = floatAvg.Diagnostics.ToString();
            Assert.IsTrue(diagnostics.Contains("queryMetrics"));

            Response <float?> floatNullableAvg = await linqQueryable.Select(item => (float?)item.taskNum).AverageAsync();

            Assert.AreEqual <float?>(42, floatNullableAvg);
            Assert.IsTrue(floatNullableAvg.RequestCharge > 0);
            diagnostics = floatNullableAvg.Diagnostics.ToString();
            Assert.IsTrue(diagnostics.Contains("queryMetrics"));

            Response <double> doubleAvg = await linqQueryable.Select(item => (double)item.taskNum).AverageAsync();

            Assert.AreEqual <double>(42, doubleAvg);
            Assert.IsTrue(doubleAvg.RequestCharge > 0);
            diagnostics = doubleAvg.Diagnostics.ToString();
            Assert.IsTrue(diagnostics.Contains("queryMetrics"));

            Response <double?> doubleNullableAvg = await linqQueryable.Select(item => (double?)item.taskNum).AverageAsync();

            Assert.AreEqual <double?>(42, doubleNullableAvg);
            Assert.IsTrue(doubleNullableAvg.RequestCharge > 0);
            diagnostics = doubleNullableAvg.Diagnostics.ToString();
            Assert.IsTrue(diagnostics.Contains("queryMetrics"));

            Response <double> longToDoubleAvg = await linqQueryable.Select(item => (long)item.taskNum).AverageAsync();

            Assert.AreEqual <double>(42, longToDoubleAvg);
            Assert.IsTrue(longToDoubleAvg.RequestCharge > 0);
            diagnostics = longToDoubleAvg.Diagnostics.ToString();
            Assert.IsTrue(diagnostics.Contains("queryMetrics"));

            Response <double?> longToNullableDoubleAvg = await linqQueryable.Select(item => (long?)item.taskNum).AverageAsync();

            Assert.AreEqual <double?>(42, longToNullableDoubleAvg);
            Assert.IsTrue(longToNullableDoubleAvg.RequestCharge > 0);
            diagnostics = longToNullableDoubleAvg.Diagnostics.ToString();
            Assert.IsTrue(diagnostics.Contains("queryMetrics"));

            Response <decimal> decimalAvg = await linqQueryable.Select(item => (decimal)item.taskNum).AverageAsync();

            Assert.AreEqual <decimal>(42, decimalAvg);
            Assert.IsTrue(decimalAvg.RequestCharge > 0);
            diagnostics = decimalAvg.Diagnostics.ToString();
            Assert.IsTrue(diagnostics.Contains("queryMetrics"));

            Response <decimal?> decimalNullableAvg = await linqQueryable.Select(item => (decimal?)item.taskNum).AverageAsync();

            Assert.AreEqual <decimal?>(42, decimalNullableAvg);
            Assert.IsTrue(decimalNullableAvg.RequestCharge > 0);
            diagnostics = decimalNullableAvg.Diagnostics.ToString();
            Assert.IsTrue(diagnostics.Contains("queryMetrics"));

            //Adding more items to test min and max function
            ToDoActivity toDoActivity = ToDoActivity.CreateRandomToDoActivity();

            toDoActivity.taskNum = 20;
            toDoActivity.id      = "minTaskNum";
            await this.Container.CreateItemAsync(toDoActivity, new PartitionKey(toDoActivity.status));

            toDoActivity.taskNum = 100;
            toDoActivity.id      = "maxTaskNum";
            await this.Container.CreateItemAsync(toDoActivity, new PartitionKey(toDoActivity.status));

            Response <int> minTaskNum = await linqQueryable.Select(item => item.taskNum).MinAsync();

            Assert.AreEqual(20, minTaskNum);

            Response <int> maxTaskNum = await linqQueryable.Select(item => item.taskNum).MaxAsync();

            Assert.AreEqual(100, maxTaskNum);
        }
コード例 #14
0
        public async Task QueryOperationDiagnostic()
        {
            IList <ToDoActivity> itemList = await ToDoActivity.CreateRandomItems(this.Container, 3, randomPartitionKey : true);

            //Checking query metrics on typed query
            ToDoActivity    find = itemList.First();
            QueryDefinition sql  = new QueryDefinition("select * from ToDoActivity");

            QueryRequestOptions requestOptions = new QueryRequestOptions()
            {
                MaxItemCount   = 1,
                MaxConcurrency = 1,
            };

            FeedIterator <ToDoActivity> feedIterator = this.Container.GetItemQueryIterator <ToDoActivity>(
                sql,
                requestOptions: requestOptions);

            if (feedIterator.HasMoreResults)
            {
                FeedResponse <ToDoActivity> iter = await feedIterator.ReadNextAsync();

                Assert.IsTrue(((QueryOperationStatistics)iter.Diagnostics).queryMetrics.Values.First().OutputDocumentCount > 0);
            }

            sql          = new QueryDefinition("select * from ToDoActivity t ORDER BY t.cost");
            feedIterator = this.Container.GetItemQueryIterator <ToDoActivity>(
                sql,
                requestOptions: requestOptions);
            if (feedIterator.HasMoreResults)
            {
                FeedResponse <ToDoActivity> iter = await feedIterator.ReadNextAsync();

                Assert.IsTrue(((QueryOperationStatistics)iter.Diagnostics).queryMetrics.Values.First().OutputDocumentCount > 0);
            }

            sql          = new QueryDefinition("select DISTINCT t.cost from ToDoActivity t");
            feedIterator = this.Container.GetItemQueryIterator <ToDoActivity>(
                sql,
                requestOptions: requestOptions);
            if (feedIterator.HasMoreResults)
            {
                FeedResponse <ToDoActivity> iter = await feedIterator.ReadNextAsync();

                Assert.IsNotNull((QueryOperationStatistics)iter.Diagnostics);
                Assert.AreEqual(1, ((QueryOperationStatistics)iter.Diagnostics).queryMetrics.Values.First().OutputDocumentCount);
            }

            sql          = new QueryDefinition("select * from ToDoActivity OFFSET 1 LIMIT 1");
            feedIterator = this.Container.GetItemQueryIterator <ToDoActivity>(
                sql,
                requestOptions: requestOptions);
            if (feedIterator.HasMoreResults)
            {
                FeedResponse <ToDoActivity> iter = await feedIterator.ReadNextAsync();

                Assert.IsTrue(((QueryOperationStatistics)iter.Diagnostics).queryMetrics.Values.First().OutputDocumentCount > 0);
            }

            //Checking query metrics on stream query
            sql = new QueryDefinition("select * from ToDoActivity");

            FeedIterator iterator = this.Container.GetItemQueryStreamIterator(
                sql,
                requestOptions: requestOptions);

            if (iterator.HasMoreResults)
            {
                ResponseMessage responseMessage = await iterator.ReadNextAsync();

                Assert.IsTrue(((QueryOperationStatistics)responseMessage.Diagnostics).queryMetrics.Values.First().OutputDocumentCount > 0);
            }
        }
コード例 #15
0
        public async Task QueryableExtentionFunctionsTest()
        {
            //Creating items for query.
            IList <ToDoActivity> itemList = await ToDoActivity.CreateRandomItems(container : this.Container, pkCount : 10, perPKItemCount : 1, randomPartitionKey : true);

            IOrderedQueryable <ToDoActivity> linqQueryable = this.Container.GetItemLinqQueryable <ToDoActivity>();

            int count = await linqQueryable.CountAsync();

            Assert.AreEqual(10, count);

            int intSum = await linqQueryable.Select(item => item.taskNum).SumAsync();

            Assert.AreEqual(420, intSum);

            int?intNullableSum = await linqQueryable.Select(item => item.taskNum).SumAsync();

            Assert.AreEqual(420, intNullableSum);

            float floatSum = await linqQueryable.Select(item => (float)item.taskNum).SumAsync();

            Assert.AreEqual(420, intSum);

            float?floatNullableSum = await linqQueryable.Select(item => (float?)item.taskNum).SumAsync();

            Assert.AreEqual(420, intNullableSum);

            double doubleSum = await linqQueryable.Select(item => (double)item.taskNum).SumAsync();

            Assert.AreEqual(420, doubleSum);

            double?doubleNullableSum = await linqQueryable.Select(item => (double?)item.taskNum).SumAsync();

            Assert.AreEqual(420, doubleNullableSum);

            long longSum = await linqQueryable.Select(item => (long)item.taskNum).SumAsync();

            Assert.AreEqual(420, longSum);

            long?longNullableSum = await linqQueryable.Select(item => (long?)item.taskNum).SumAsync();

            Assert.AreEqual(420, longNullableSum);

            decimal decimalSum = await linqQueryable.Select(item => (decimal)item.taskNum).SumAsync();

            Assert.AreEqual(420, decimalSum);

            decimal?decimalNullableSum = await linqQueryable.Select(item => (decimal?)item.taskNum).SumAsync();

            Assert.AreEqual(420, decimalNullableSum);

            double intToDoubleAvg = await linqQueryable.Select(item => item.taskNum).AverageAsync();

            Assert.AreEqual(42, intToDoubleAvg);

            double?intToDoubleNulableAvg = await linqQueryable.Select(item => item.taskNum).AverageAsync();

            Assert.AreEqual(42, intToDoubleNulableAvg);

            float floatAvg = await linqQueryable.Select(item => (float)item.taskNum).AverageAsync();

            Assert.AreEqual(42, floatAvg);

            float?floatNullableAvg = await linqQueryable.Select(item => (float?)item.taskNum).AverageAsync();

            Assert.AreEqual(42, floatNullableAvg);

            double doubleAvg = await linqQueryable.Select(item => (double)item.taskNum).AverageAsync();

            Assert.AreEqual(42, doubleAvg);

            double?doubleNullableAvg = await linqQueryable.Select(item => (double?)item.taskNum).AverageAsync();

            Assert.AreEqual(42, doubleNullableAvg);

            double longToDoubleAvg = await linqQueryable.Select(item => (long)item.taskNum).AverageAsync();

            Assert.AreEqual(42, longToDoubleAvg);

            double?longToNullableDoubleAvg = await linqQueryable.Select(item => (long?)item.taskNum).AverageAsync();

            Assert.AreEqual(42, longToNullableDoubleAvg);

            decimal decimalAvg = await linqQueryable.Select(item => (decimal)item.taskNum).AverageAsync();

            Assert.AreEqual(42, decimalAvg);

            decimal?decimalNullableAvg = await linqQueryable.Select(item => (decimal?)item.taskNum).AverageAsync();

            Assert.AreEqual(42, decimalNullableAvg);

            //Adding more items to test min and max function
            ToDoActivity toDoActivity = ToDoActivity.CreateRandomToDoActivity();

            toDoActivity.taskNum = 20;
            toDoActivity.id      = "minTaskNum";
            await this.Container.CreateItemAsync(toDoActivity, new PartitionKey(toDoActivity.status));

            toDoActivity.taskNum = 100;
            toDoActivity.id      = "maxTaskNum";
            await this.Container.CreateItemAsync(toDoActivity, new PartitionKey(toDoActivity.status));

            int minTaskNum = await linqQueryable.Select(item => item.taskNum).MinAsync();

            Assert.AreEqual(20, minTaskNum);

            int maxTaskNum = await linqQueryable.Select(item => item.taskNum).MaxAsync();

            Assert.AreEqual(100, maxTaskNum);
        }