如何在 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 类似的概念。
我正在使用 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 类似的概念。