Azure 使用页面大小和页码在Cosmos DB中分页
我正在尝试使用Azure 使用页面大小和页码在Cosmos DB中分页,azure,asp.net-core,pagination,azure-cosmosdb,paging,Azure,Asp.net Core,Pagination,Azure Cosmosdb,Paging,我正在尝试使用PageSize和PageNumber从cosmosDB返回项目。我知道我们可以在MaxItemCount)中设置页面大小,但是如何将页码放入此函数中 以下是我目前得到的信息: public async Task<IEnumerable<T>> RunSQLQueryAsync(string queryString, int pageSize, int pageNumber) { var feedOptions =
PageSize
和PageNumber
从cosmosDB返回项目。我知道我们可以在MaxItemCount
)中设置页面大小,但是如何将页码放入此函数中
以下是我目前得到的信息:
public async Task<IEnumerable<T>> RunSQLQueryAsync(string queryString, int pageSize, int pageNumber)
{
var feedOptions = new FeedOptions { MaxItemCount = pageSize, EnableCrossPartitionQuery = true };
IQueryable<T> filter = _client.CreateDocumentQuery<T>(_collectionUri, queryString, feedOptions);
IDocumentQuery<T> query = filter.AsDocumentQuery();
var currentPageNumber = 0;
var documentNumber = 0;
List<T> results = new List<T>();
while (query.HasMoreResults)
{
foreach (T t in await query.ExecuteNextAsync())
{
results.Add(t);
documentNumber++;
}
currentPageNumber++;
return results;
}
return null;
}
public异步任务RunSQLQueryAsync(字符串queryString,int pageSize,int pageNumber)
{
var feedOptions=new feedOptions{MaxItemCount=pageSize,EnableCrossPartitionQuery=true};
IQueryable筛选器=_client.CreateDocumentQuery(_collectionUri、queryString、feedOptions);
IDocumentQuery=filter.AsDocumentQuery();
var currentPageNumber=0;
var documentNumber=0;
列表结果=新列表();
while(query.HasMoreResults)
{
foreach(T在wait query.ExecuteNextAsync()中)
{
结果:添加(t);
documentNumber++;
}
currentPageNumber++;
返回结果;
}
返回null;
}
目前,分页支持仅基于延续令牌
以下是有关此限制的一些有趣的讨论和功能请求:
---延续令牌示例--- 以下示例说明了一种基于所需页码、页面大小和延续标记查询文档的方法(与您的方法非常类似):
私有静态异步任务QueryDocumentsByPage(int pageNumber、int pageSize、string continuationToken)
{
DocumentClient DocumentClient=new DocumentClient(新Uri(“https://{CosmosDB/SQL Account Name}.documents.azure.com:443/”,“{CosmosDB/SQL Account Key}”);
var feedOptions=新的feedOptions{
MaxItemCount=pageSize,
EnableCrossPartitionQuery=true,
//要点:设置延续令牌(第一个请求/页面为空)
RequestContinuation=continuationToken
};
IQueryable filter=documentClient.CreateDocumentQuery(“dbs/{Database Name}/colls/{Collection Name}”,feedOptions);
IDocumentQuery=filter.AsDocumentQuery();
FeedResponse FeedResponse=await query.ExecuteExtAsync();
列表文档=新列表();
foreach(饲料中的芹菜任务t)
{
文件.添加(t);
}
//重要提示:确保为下一个请求保留延续令牌
返回新的KeyValuePair(feedRespose.ResponseContinuation,文档);
}
现在,以下示例演示了如何通过调用前面的方法检索给定页面的文档:
private静态异步任务QueryPageByPage()
{
//每页文档数
const int PAGE_SIZE=3;
int currentPageNumber=1;
int documentNumber=1;
//后续查询的延续令牌(第一个请求/页面为空)
字符串continuationToken=null;
做
{
Console.WriteLine($“----第{currentPageNumber}----页);
//加载当前页面的所有文档
KeyValuePair currentPage=Wait QueryDocumentsByPage(当前页码、页面大小、continuationToken);
foreach(currentPage.Value中的CeleryTask CeleryTask)
{
WriteLine($“[{documentNumber}]{celeryTask.Id}”);
documentNumber++;
}
//确保为下一页查询执行保留延续令牌
continuationToken=currentPage.Key;
currentPageNumber++;
}while(continuationToken!=null);
Console.WriteLine(“\n---END:查询完所有数据元---”;
}
公共静态列表分页(int pageNo=1,int pageSize=20)
{
List ArticlesList=新列表();
var collection=UriFactory.CreateDocumentCollectionUri(数据库名,loginCollectionId)
使用(client=newdocumentclient(新Uri(endpointUrl),primaryKey))
{
var选项S=新的馈线选项
{
MaxItemCount=(pageNo!=1)?((pageNo-1)*页面大小):((pageNo)*页面大小)
};
var query1=client.CreateDocumentQuery(collection,options).OrderByDescending(x=>x.。_ts).AsDocumentQuery();
var res=query1.ExecuteNextAsync().Result;
如果(页码==1)
{
return ArticlesList=res.ToList();
}
其他的
{
var选项=新的馈线选项
{
MaxItemCount=pageSize,
RequestContinuation=res.ResponseContinuation
};
var query=client.CreateDocumentQuery(集合,选项).OrderByDescending(x=>x.\u ts).AsDocumentQuery();
while(query.HasMoreResults)
{
return ArticlesList=query.ExecuteNextAsync().Result.ToList();
}
}
退货物品清单;
}
}
现在,通过新的偏移限制条款,Cosmos DB中提供了跳过和执行:
有一个解决办法,但不是最佳的:
...
int pageNumber = 1;
int pageSize = 10;
...
var query = Client.CreateDocumentQuery<T>(
UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId),
new FeedOptions { MaxItemCount = pageNumber * pageSize }) // Limit count or returned items
.Where(predicate)
.AsDocumentQuery();
var results = new List<T>();
int resultsToSkip = (pageNumber - 1) * pageSize;
while (query.HasMoreResults)
{
var result = await query.ExecuteNextAsync<T>();
// Skip pages, not optimal way, the best solution is to use RequestContinuation token.
if (resultsToSkip > 0)
{
resultsToSkip--;
continue;
}
results.AddRange(result);
}
return results;
...
。。。
int pageNumber=1;
int pageSize=10;
...
var query=Client.CreateDocumentQuery(
CreateDocumentCollectionUri(数据库ID,CollectionId),
new FeedOptions{MaxItemCount=pageNumber*pageSize})//限制计数或返回的项目
.Where(谓词)
.AsDocumentQuery();
var results=新列表();
int resultsToSkip=(页码-1)*页面大小;
while(query.HasMoreResults)
{
var result=await query.ExecuteNextAsync();
//跳过页面,不是最佳方式,最好的解决方案是使用RequestCo
...
int pageNumber = 1;
int pageSize = 10;
...
var query = Client.CreateDocumentQuery<T>(
UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId),
new FeedOptions { MaxItemCount = pageNumber * pageSize }) // Limit count or returned items
.Where(predicate)
.AsDocumentQuery();
var results = new List<T>();
int resultsToSkip = (pageNumber - 1) * pageSize;
while (query.HasMoreResults)
{
var result = await query.ExecuteNextAsync<T>();
// Skip pages, not optimal way, the best solution is to use RequestContinuation token.
if (resultsToSkip > 0)
{
resultsToSkip--;
continue;
}
results.AddRange(result);
}
return results;
...