此问题之前已发布here,但我在此重复此问题和讨论摘要以提出完整的问题。
我在ASP.NET WebAPI中设置了一个ODataController,其中DocumentDB / CosmosDB作为后端。它工作得很好,我返回CreateDocumentQuery的结果和$ select,$ top,$ orderby和$ filter工作正常。
但是,$ skip不会。我知道这是一个计划的功能(投票here),但我想知道是否有任何临时解决方法。
我的计划是有一个" continuationToken"我的OData控制器动作的参数。然后我将使用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,但是有更好的解决方案吗?
答案 0 :(得分:0)
您是否看过PageResult对象?
对于非OData格式,通过将查询结果包装在PageResult对象中,仍然可以支持下一页链接和内联计数。但是,它需要更多的代码。这是一个例子:
public PageResult<Product> Get(ODataQueryOptions<Product> options)
{
ODataQuerySettings settings = new ODataQuerySettings()
{
PageSize = 5
};
IQueryable results = options.ApplyTo(_products.AsQueryable(), settings);
return new PageResult<Product>(
results as IEnumerable<Product>,
Request.GetNextPageLink(),
Request.GetInlineCount());
}