这个问题之前发布过here但是我在这里重复这个问题和讨论的摘要以提出一个完整的问题 .
我在ASP.NET WebAPI中设置了一个ODataController,其中DocumentDB / CosmosDB作为后端 . 它工作得很好,我返回CreateDocumentQuery的结果和$ select,$ top,$ orderby和$ filter工作正常 .
但是,$ skip不会 . 我知道这是一个计划的功能(投票here),但我想知道是否有任何临时解决方法 .
我的计划是在我的OData控制器操作中有一个“continuationToken”参数 . 然后我将使用FeedOptions.RequestContinuation将其传递给CreateDocumentQuery . 但是,CreateDocumentQuery不会返回响应令牌 . 然后我尝试使用ReadDocumentFeedAsync,它确实返回一个响应令牌,但它不返回IQueryable .
这是ODataController中的api代码示例:
public IQueryable<Result> FindResults(Uri collectionUri, string continuationToken)
{
FeedOptions feedOptions = new FeedOptions();
feedOptions.MaxItemCount = 100;
feedOptions.RequestContinuation = continuationToken;
var query = client.CreateDocumentQuery<Result>(collectionUri, queryString, feedOptions).AsDocumentQuery();
return query as IQueryable<Result>;
}
但是,客户端代码会是什么样的?即什么是保持IQueryable活动所需的http请求,以便在分页时能够使用continuationToken?我想我可以将ReadDocumentFeedAsync的结果存储在内存中并返回一个IQueryable,但是有更好的解决方案吗?
1 回答
你看过PageResult对象了吗?
对于非OData格式,通过将查询结果包装在PageResult对象中,仍然可以支持下一页链接和内联计数 . 但是,它需要更多的代码 . 这是一个例子:
https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options