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

sac*_*chu 8 c# asp.net azure azure-table-storage azure-tablequery

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

Pageable<T> pageable = client.QueryAsync<T>(filter : value, maxPerPage : 10);
Run Code Online (Sandbox Code Playgroud)

我应该做出哪些改变?

提前致谢 !!:)

Kal*_*SFT 20

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

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")}");
                    }
                }
Run Code Online (Sandbox Code Playgroud)


小智 5

我通过创建一个扩展方法解决了这个问题,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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

query.AsPages(continuationToken).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 除此之外,如果您想在 IAsyncEnumerable 上使用 LINQ(包括 FirstOrDefault),您还可以使用 [System.Linq.Async 包](https://www.nuget.org/packages/System.Linq.Async/ ) (2认同)