示例#1
0
        public async Task <PagedQueryResult <KeyValuePair <Key, Value>, Continuation> > Query(Range <string> partitionRange, Range <string> rowRange,
                                                                                              int?pageSize = null, Continuation continuationToken = null)
        {
            if ((pageSize ?? 1) <= 0)
            {
                throw new ArgumentOutOfRangeException(paramName: nameof(pageSize));
            }
            if ((PageSizeLimit ?? int.MaxValue) < (pageSize ?? 1))
            {
                throw new ArgumentOutOfRangeException(paramName: nameof(pageSize), message: "Too many records requested");
            }

            var filter = TableQuery.CombineFilters(
                RangeFilter(nameof(ITableEntity.RowKey), rowRange),
                TableOperators.And,
                RangeFilter(nameof(ITableEntity.PartitionKey), partitionRange));

            var query = new TableQuery <DynamicTableEntity> {
                TakeCount = pageSize,
            }.Where(filter);

            var actualToken = ContinuationToken.Deserialize(continuationToken);

            var page = await this.table.ExecuteQuerySegmentedAsync(query, actualToken).ConfigureAwait(false);

            var results = page.Results.Select(entity => new KeyValuePair <Key, Value>(
                                                  key: new Key(partition: KeyDecode(entity.PartitionKey), row: KeyDecode(entity.RowKey)),
                                                  value: ParseValue(entity)
                                                  )).ToArray();
            var serializedContinuation = ContinuationToken.Serialize(page.ContinuationToken);

            return(new PagedQueryResult <KeyValuePair <Key, Value>, Continuation>(results, serializedContinuation));
        }