DocumentDb DocumentClient 获取前 25 个文档

DocumentDb DocumentClient get first 25 documents

开始使用 Cosmos 和文档 db/sql。为什么这不起作用?没有错误被抛出,我可以看到。有数据应该return.

    private const string EndpointUri = "some url";
    private const string PrimaryKey = "somekey";
    private const string DbId = "People";
    private const string CollectionId = "Person";
    private DocumentClient client;

    // GET: api/Person
    [HttpGet]
    public IEnumerable<Person> Get()
    {
        this.client = new DocumentClient(new Uri(EndpointUri), PrimaryKey);
        FeedOptions queryOptions = new FeedOptions { MaxItemCount = 25, EnableCrossPartitionQuery = true };



        IQueryable<Person> personQuery = this.client.CreateDocumentQuery<Person>(
            UriFactory.CreateDocumentCollectionUri(DbId, CollectionId), queryOptions)
            .Where(f => f.NameFirst != "Andersen");

        List<Person> retVal = new List<Person>();
        retVal = personQuery.ToList();
        return retVal;
    }

MaxItemCount 是每次枚举操作您将获得的最大项目数。它不是 return 前 25 个文档,而是每个枚举 25 个文档的聚合批次中匹配此查询的所有文档。

如果您想要前 25 项,您的代码应如下所示:

[HttpGet]
public async Task<IEnumerable<Person>> Get()
{
    this.client = new DocumentClient(new Uri(EndpointUri), PrimaryKey);
    FeedOptions queryOptions = new FeedOptions { EnableCrossPartitionQuery = true };

    var personQuery = this.client.CreateDocumentQuery<Person>(
        UriFactory.CreateDocumentCollectionUri(DbId, CollectionId), queryOptions)
        .Where(f => f.NameFirst != "Andersen").Take(25).AsDocumentQuery();

    List<Person> retVal = new List<Person>();

    while(personQuery.HasMoreResults)
    {
        var results = await personQuery.ExecuteNextAsync<Person>();
        retVal.AddRange(results);
    }

    return retVal;
}

根据您在集合中索引字符串的方式,您可能还需要将 FeedOptions 对象的 EnableScanInQuery 属性 设置为 true.

如 Nick 所述,要获得所需的顶级文档,使用 LINQ .Take() 是正确的方法。

使用 FeedOptions.MaxItemCount 和 ExecuteNextAsync 也是一种替代方法。但是,正如您观察到的那样,它可能 return 0 个结果,因此需要考虑到这一点。关于这方面的更多细节,请参考 Aravind 对这个相关问题的评论:ExecuteNextAsync Not Working.