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;
    ...