使用ExecuteSegmented获取特定数量的分页结果

时间:2016-01-29 16:55:28

标签: c# azure pagination azure-table-storage

我对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个结果?

1 个答案:

答案 0 :(得分:3)

您可以做的一件事就是继续减少记录数量,以便在每次查询迭代中获取。因此,您首先要获取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));