如何在 TableClient.QueryAsync() [Azure.Data.Tables] 中过滤分页查询结果

How to Filter the query result for pagination in TableClient.QueryAsync() [Azure.Data.Tables]

我正在使用 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);

我应该做出哪些改变?

提前致谢!! :)

这是我们 samples 的片段。

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")}");
                    }
                }

我通过为 IAsyncEnumerable 创建一个扩展方法解决了这个问题,它将 return 作为 IAsyncEnumerable 的第一项。在 AsyncPageable<T> query 上调用 AsPages() 后,您有一个 IAsyncEnumerable<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();

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

查看 documentation 了解更多详细信息(单击参数和 return 类型)。

我使用 this example 作为令牌缓存的灵感。您还可以使用 Microsoft.Azure.Cosmos.Table 库查找示例,这里使用了与 ContinuationTokens 类似的概念。