DocumentDb DocumentClient получить первые 25 документов
Начало работы с 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;
}
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
,
Чтобы получить лучшие документы, как вы хотели, используйте LINQ .Take() - правильный путь, как отметил Ник.
Использование FeedOptions.MaxItemCount и ExecuteNextAsync также является альтернативой. Однако он может вернуть 0 результатов, как вы заметили, поэтому это необходимо учитывать. Для получения более подробной информации, пожалуйста, обратитесь к комментарию Аравинда по этому связанному вопросу: ExecuteNextAsync не работает.