.net core 如何允许Odata选项应用于cosmos db集合并返回筛选记录

.net core 如何允许Odata选项应用于cosmos db集合并返回筛选记录,.net-core,odata,azure-cosmosdb,paging,webapi,.net Core,Odata,Azure Cosmosdb,Paging,Webapi,我需要在api上实现分页。我在下面做的是在api上启用OData查询,但它在从COSMOSDB获取所有记录后进行过滤,但我想从COSMOSDB获取过滤后的记录。如何将Odata查询选项转换为cosmos db查询选项 controller.cs [Route("apps")] [HttpGet] [EnableQuery] public async Task<IActio

我需要在api上实现分页。我在下面做的是在api上启用OData查询,但它在从COSMOSDB获取所有记录后进行过滤,但我想从COSMOSDB获取过滤后的记录。如何将Odata查询选项转换为cosmos db查询选项

 controller.cs

            [Route("apps")]
            [HttpGet]
            [EnableQuery]
            public async Task<IActionResult> GetAllApps(CancellationToken cancellationToken)
            {
                var user = this.GetUser();
                var results = await this.appRepository.GetAppsForUserAsync(user, cancellationToken).ConfigureAwait(false);
                return this.Ok(this.mapper.Map<AppHeader[]>(results));
            }

在存储库中,尝试使用并查询。注意,我在这里使用的是较新的V3SDK,但在较旧的SDK中也应该存在相同的版本

//将'skip'和'top'参数作为存储库方法的输入。

列表。

谢谢您的回答!。我会考虑这一点,但是如何将跳过和顶部PARS作为存储库方法的输入呢?如何对从客户端到控制器的绑定skip和top进行建模?您可以从控制器操作绑定到模型。我同意您的选择,但在这里,我希望在不使用较新的V3 SDK Microsoft.Azure.Cosmos的情况下实现该功能
AppRepository.cs
 public async Task<IEnumerable<App>> GetAppsForUserAsync(User user, CancellationToken cancellationToken)
        {            
            try
            {
                FeedOptions queryOptions = new FeedOptions
                {
                    MaxItemCount = -1,
                    PartitionKey = new PartitionKey(user)
                };

                var query = this.factory.GetClient()
                    .CreateDocumentQuery<App>(
                        UriFactory.CreateDocumentCollectionUri(DatabaseName, CollectionName),
                        queryOptions)
                    .Where(resource => resource.UserList.Any(u => u.userId == user.Id))
                    .AsDocumentQuery();

                List<App> results = new List<App>();
                while (query.HasMoreResults)
                {
                    cancellationToken.ThrowIfCancellationRequested();

                    var response = await query.ExecuteNextAsync<App>(cancellationToken).ConfigureAwait(false);

                    var app = this.mapper.Map<App[]>(response);
                    results.AddRange(app);
                }

                return results;
            }
            catch (DocumentClientException ex)
            {
                this.logger.LogError(ex, ex.Message);
                throw;
            }
        }
Client.js

http://localhost:8303/api/appdefinitions/my?$skip=6&$top=4`