首页 文章

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

提问于
浏览
2

这个问题之前发布过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 回答

  • 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

相关问题