/// <summary>
        /// Queries the collection
        /// https://msdn.microsoft.com/en-us/library/azure/dn783363.aspx
        /// </summary>
        /// <param name="queryString">Query string</param>
        /// <param name="queryParams">Query parameters</param>
        /// <param name="pageSize">Page size for result paging</param>
        /// <param name="continuationToken">Continuation token for next page</param>
        /// <returns>One page of results, with meta data</returns>
        public async Task <DocDbRestQueryResult> QueryCollectionAsync(
            string queryString,
            Dictionary <string, object> queryParams,
            int pageSize             = -1,
            string continuationToken = null)
        {
            if (string.IsNullOrWhiteSpace(queryString))
            {
                throw new ArgumentNullException(nameof(queryString));
            }

            var query =
                this.documentDbClient.CreateDocumentQuery <JObject>(
                    UriFactory.CreateDocumentCollectionUri(this.databaseName, this.collectionName),
                    new SqlQuerySpec
            {
                QueryText  = queryString,
                Parameters = ToSqlQueryParamtereCollection(queryParams)
            },
                    new FeedOptions {
                MaxItemCount = pageSize, RequestContinuation = continuationToken
            })
                .AsDocumentQuery();

            var response = await query.ExecuteNextAsync <JObject>().ConfigureAwait(false);

            var result = new DocDbRestQueryResult
            {
                ResultSet         = new JArray(response.ToArray()),
                TotalResults      = response.Count,
                ContinuationToken = query.HasMoreResults ? response.ResponseContinuation : null
            };

            return(result);
        }
        /// <summary>
        /// The query document collection async.
        /// </summary>
        /// <param name="queryString">
        /// The query string.
        /// </param>
        /// <param name="queryParams">
        /// The query parameters.
        /// </param>
        /// <param name="partitionId">
        /// The partition id.
        /// </param>
        /// <param name="enableCrossPartitionQuery">
        /// The enable cross partition query.
        /// </param>
        /// <param name="enableScanInQuery">
        /// The enable scan in query.
        /// </param>
        /// <param name="pageSize">
        /// The page size.
        /// </param>
        /// <param name="maxDegreeOfParallelism">
        /// The max degree of parallelism.
        /// </param>
        /// <param name="continuationToken">
        /// The continuation token.
        /// </param>
        /// <returns>
        /// The <see cref="Task"/>.
        /// Document DB query result
        /// </returns>
        /// <exception cref="ArgumentNullException">
        /// Null argument
        /// </exception>
        private async Task <DocDbRestQueryResult> QueryDocumentCollectionAsync(
            string queryString,
            Dictionary <string, object> queryParams,
            string partitionId,
            bool enableCrossPartitionQuery,
            bool enableScanInQuery,
            int pageSize,
            int maxDegreeOfParallelism,
            string continuationToken)
        {
            if (string.IsNullOrWhiteSpace(queryString))
            {
                throw new ArgumentNullException(nameof(queryString));
            }

            var feedOptions = new FeedOptions
            {
                PartitionKey = new PartitionKey(partitionId),
                EnableCrossPartitionQuery = enableCrossPartitionQuery,
                EnableScanInQuery         = enableScanInQuery,
                MaxItemCount           = pageSize,
                RequestContinuation    = continuationToken,
                MaxDegreeOfParallelism = maxDegreeOfParallelism
            };

            var query =
                this.documentDbClient.CreateDocumentQuery <JObject>(
                    UriFactory.CreateDocumentCollectionUri(this.databaseName, this.collectionName),
                    new SqlQuerySpec
            {
                QueryText  = queryString,
                Parameters = ToSqlQueryParamtereCollection(queryParams)
            },
                    feedOptions)
                .AsDocumentQuery();

            var response = await query.ExecuteNextAsync <JObject>().ConfigureAwait(false);

            var result = new DocDbRestQueryResult
            {
                ResultSet         = new JArray(response.ToArray()),
                TotalResults      = response.Count,
                ContinuationToken = query.HasMoreResults ? response.ResponseContinuation : null
            };

            return(result);
        }