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.
开始使用 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.