DocumentAP / CosmosDB中的WebAPI OData和跳过/分页

时间:2018-04-16 12:59:01

标签: asp.net-web-api odata azure-cosmosdb

此问题之前已发布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,但是有更好的解决方案吗?

1 个答案:

答案 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());
}

https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options