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;
}
答案 0 :(得分: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
对象的FeedOptions
属性设置为true
。
答案 1 :(得分:0)
如尼克所言,要使用LINQ来获取所需的主要文档,Take()是正确的方法。
使用FeedOptions.MaxItemCount和ExecuteNextAsync也是一种选择。但是,如您所见,它可能会返回0个结果,因此需要考虑在内。有关更多信息,请参阅Aravind对以下相关问题的评论:ExecuteNextAsync Not Working。