Общий запрос OrderBy CosmosDB или сначала получить последние данные - PullRequest
0 голосов
/ 26 апреля 2018

Я использую код из проекта Azure, когда CosmosDB создается впервые. У него хороший общий GetItemsAsync метод.

Я немного изменил его, чтобы иметь следующее:

 public static async Task<List<T>> GetItemsAsync(Expression<Func<T, bool>> predicate, int maxItemCount = -1)
    {
        IDocumentQuery<T> query = client.CreateDocumentQuery<T>(
            UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId),
            new FeedOptions { MaxItemCount = maxItemCount })
            .Where(predicate)
            .AsDocumentQuery();

        List<T> results = new List<T>();
        while (query.HasMoreResults)
        {
            results.AddRange(await query.ExecuteNextAsync<T>());
            if (maxItemCount != -1)
            {
                break;
            }
        }

        return results;
    }

В некоторых вызовах этого метода мне нужно добавить запрос OrderBy. Проблема в том, что у меня есть пара коллекций в одном и том же CosmosDB, и поля разные. Когда я хочу перечислить одну из коллекций, я просто хочу получить последние.

Так что в этом примере я на самом деле отправляю count как 50, поэтому я получу только 50, но я также хочу получить последние. Приведенный выше код возвращает самые старые 50, как и ожидалось. Есть ли какое-нибудь решение этого? Я предполагаю, что может быть способ сначала получить последние данные, а когда я позвоню 50, это будут последние 50 записей.

Другая вещь, которую я попытался, состояла в том, чтобы создать другой метод с именем GetItemsWithOrderByAsync и попытался дать Expression>, но для поддержки TKey требуется так много изменений во всем классе.

1 Ответ

0 голосов
/ 26 апреля 2018

Хорошо, после игры, я придумал следующее решение. Создан новый метод и:

 public static async Task<List<T>> GetItemsWithOrderByAsync(Expression<Func<T, bool>> predicate, Expression<Func<T, object>> orderByPredicated, int maxItemCount = -1)
    {
        IDocumentQuery<T> query = client.CreateDocumentQuery<T>(
            UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId),
            new FeedOptions { MaxItemCount = maxItemCount }).
            Where(predicate).
            OrderByDescending(orderByPredicated).
            AsDocumentQuery();

        List<T> results = new List<T>();
        while (query.HasMoreResults)
        {
            results.AddRange(await query.ExecuteNextAsync<T>());
            if (maxItemCount != -1)
            {
                break;
            }
        }

        return results;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...