DocumentDb DocumentClient получить первые 25 документов - PullRequest
0 голосов
/ 23 сентября 2018

Начало работы с 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 ]

0 голосов
/ 25 сентября 2018

Чтобы получить лучшие документы, как вы хотели, используйте LINQ .Take () - правильный путь, как отметил Ник.

Использование FeedOptions.MaxItemCount и ExecuteNextAsync также является альтернативой.Однако он может вернуть 0 результатов, как вы заметили, поэтому это необходимо учитывать.Подробнее об этом см. Комментарий Аравинда по этому связанному вопросу: ExecuteNextAsync не работает .

0 голосов
/ 23 сентября 2018

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.

...