2

我正在使用Azure.Data.Tables包和TableClient.QueryAsync()方法来获取查询结果。我希望结果将其用于分页我在https://docs.microsoft.com/en-us/dotnet/api/azure.data.tables.tableclient.queryasync?view=azure-dotnet中遇到了这段代码

Pageable<T> pageable = client.QueryAsync<T>(filter : value, maxPerPage : 10);

我应该做些什么改变?

提前致谢 !!:)

4

2 回答 2

5

这是我们示例中的一个片段。

AsyncPageable<TableEntity> queryResultsMaxPerPage = tableClient.QueryAsync<TableEntity>(filter: $"PartitionKey eq '{partitionKey}'", maxPerPage: 10);
    
                await foreach (Page<TableEntity> page in queryResultsMaxPerPage.AsPages())
                {
                    Console.WriteLine("This is a new page!");
                    foreach (TableEntity qEntity in page.Values)
                    {
                        Console.WriteLine($"# of {qEntity.GetString("Product")} inventoried: {qEntity.GetInt32("Quantity")}");
                    }
                }
于 2021-08-20T09:27:04.363 回答
0

我通过创建一个扩展方法解决了这个问题,该方法IAsyncEnumerable将返回一个IAsyncEnumerable. 调用后AsPages()AsyncPageable<T> queryIAsyncEnumerable<Page<T>>可以使用此方法从中获取第一页。

static class IAsyncEnumerableExtensions
    {
        public static async Task<T?> FirstOrDefault<T>(this IAsyncEnumerable<T> asyncEnumerable)
        {
            await foreach (var item in asyncEnumerable)
            {
                return item;
            }
            return default;
        }
    }

Page<T>对象具有continuationToken可以传递给AsPages(string)方法的属性,因此您可以通过以下方式获取下一页:

query.AsPages(continuationToken).FirstOrDefault();

为了能够获取上一页,您必须缓存 continuationToken,或者只调用第一页query.AsPages().FirstOrDefault();(没有 continuationToken)。

查看文档以获取更多详细信息(单击参数和返回类型)。

将此示例用作令牌缓存的灵感。您还可以使用 Microsoft.Azure.Cosmos.Table 库查找示例,此处使用了与 ContinuationTokens 类似的概念。

于 2021-12-13T13:29:48.097 回答