0

Cosmos 入门和文档 db/sql。为什么这不起作用?没有错误被抛出,我可以看到。有应该返回的数据。

    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;
    }
4

2 回答 2

2

MaxItemCount是每次枚举操作您将获得的最大项目数。它不返回前 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;
}

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

于 2018-09-23T12:49:12.630 回答
0

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

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

于 2018-09-25T17:23:36.403 回答