我有一个文档db集合,其中包含大约1500个文档 . 我最终的目标是使用上面的持久层构建一个api . 我阅读了文档(https://azure.microsoft.com/en-us/blog/documentdb-paging-support-with-top-and-more-query-improvements/),提到通过feed选项使用请求延续令牌进行分页 .
在控制台应用程序上有以下方法来理解相同的问题:这里的问题或问题是第一次执行查询时,continuation token = null但是第二次执行查询时continuation token =“some value”
所以我的问题是不应该第一次设置延续令牌吗?或者我错过了一些明显的东西
//field
private static readonly FeedOptions DefaultOptions = new FeedOptions { EnableCrossPartitionQuery = true,MaxItemCount = 1};
//method
private static async Task<bool> QueryItemDocuments(string collectionLink)
{
IDocumentQuery<Item> query = client.CreateDocumentQuery<Item>(collectionLink, new SqlQuerySpec()
{
QueryText = "SELECT * FROM items",
},DefaultOptions).AsDocumentQuery();
var loopNumber = 0;
while (query.HasMoreResults)
{
loopNumber++;
var results=(await query.ExecuteNextAsync<Item>()).ToList();
Console.WriteLine("Count {0}",results.Count);
Console.WriteLine("Loopnumber :{0} Token {1}", loopNumber, DefaultOptions.RequestContinuation ?? "Null");
Console.WriteLine("Id: {0},Name: {1}", results[0].Id, results[0].Name);
}
return query.HasMoreResults;
}
sample results from console :
Count 1
Loopnumber :1 Token Null //why is this null?
Id: 1dbaf1d0-0125-11e0-88a8-005056957023,Name:Energy Drink
Count 1
Loopnumber :2 Token - RID:jq4gAIZqMwACBBBBBBB==#RT:1#TRC:1#PKRID:0
Id: 244a8230-0231-11e0-8c8b-005056957023,Name: Gluten Free Dish
Edits :理想情况下,我会在响应标头上发回延续令牌,允许客户端在需要时获取更多(在我的网络API上) - 所以我的方法会喜欢
public Get(int? page=1,int? size=20)
所以当我用前20个发回响应时,我需要发回一个继续令牌给客户端请求更多:所以如果第一次没有设置延续令牌 - 这意味着当我检索第一批20时,怎么做我这样做?
2 回答
你走在正确的轨道上 . 两个想法:
使用
HasMoreResults
和ExecuteNext
时,无需手动处理延续令牌 .HasMoreResults
检查是否有延续令牌,当您调用ExecuteNext
时,它会自动添加 .我怀疑你没有't see a continuation on the first round is that it' s传出
DefaultOptions
并且它在第二次ExecuteNext
再次熄灭之前不会更新 . 我在想第二个循环上的输出实际上是第一个延续令牌 .好吧,所以我认为它可能是SDK或设计中的一个错误 - 不知道,但是当我使用
Document Db's rest end points
查询结果时 - 确实在第一批的响应中设置了continuation token
. 以下是使用的示例代码: