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 не работает.

Другие вопросы по тегам