使用执行分段获取特定数量的分页结果

本文关键字:分页 结果 执行 分段 获取 | 更新日期: 2023-09-27 18:32:37

我对 Azure 表存储的理解是,我们应该使用 ExecuteSegmented 对分页查询进行精细控制。这很好,但是如果我想获得(例如(500个结果,我能得到的最接近的结果是这样的:

TableQuery<Footwear> query = 
table.CreateQuery<Footwear>().Where(f => f.PartitionKey == partitionKey).Take(500).AsTableQuery();
TableContinuationToken token = null;
List<Footwear> shoes = new List<Footwear>();
do
{
    TableQuerySegment<Footwear> queryResult = query.ExecuteSegmented(token);
    token = queryResult.ContinuationToken;
    shoes.AddRange(queryResult.Results);
} while (token != null && (tableQuery.TakeCount < rows.Count));

哪种方式有效,因为(例如(第一个分页查询返回 300 个结果,因此它使用令牌获取另一个页面,但随后第二页返回(例如(250 个结果。结果是我理想地想要 500 个结果,但我得到了 550

有没有更好的方法来解决这个问题,以便我得到正好 500 个结果?

使用执行分段获取特定数量的分页结果

您可以做的一件事是继续减少每次查询迭代中要获取的记录计数。因此,您从要获取的 500 条记录开始,然后返回 300 条记录。在下一次迭代中,您尝试仅返回 200 条记录。如果你得到 200 条记录,你只需脱离循环,否则继续迭代。

像这样:

        var totalResultsToFetch = 500;
        TableQuery<Footwear> query = table.CreateQuery<Footwear>().Where(f => f.PartitionKey == partitionKey).Take(totalResultsToFetch).AsTableQuery();
        TableContinuationToken token = null;
        List<Footwear> shoes = new List<Footwear>();
        do
        {
            TableQuerySegment<Footwear> queryResult = query.ExecuteSegmented(token);
            token = queryResult.ContinuationToken;
            shoes.AddRange(queryResult.Results);
            totalResultsToFetch -= queryResult.Results.Count;
            query = table.CreateQuery<Footwear>().Where(f => f.PartitionKey == partitionKey).Take(totalResultsToFetch).AsTableQuery();
        } while (token != null && (totalResultsToFetch > 0));