Общий запрос CosmosDB OrderBy или сначала получить последние данные

Я использую код из проекта 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, а поля разные. Когда я хочу перечислить одну из коллекций, я просто хочу получить самые свежие.

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

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
319
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

 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;
    }

Ваше решение - именно то, чего я пытаюсь достичь. Можете ли вы поделиться своим кодом, который вы использовали для создания выражения orderByPredicated? Вот где я борюсь. Я знаю, как построить предикат для элемента Where, но не для элемента OrderBy.

johnnyarguelles 15.05.2018 19:50

@johnnyarguelles У меня есть что-то вроде; await CosmosDBRepository<X>.GetItemsWithOrderByAsync(n => {actualPredicate}, n => n.CreatedDate, count); Надеюсь, что это поможет

erincerol 16.05.2018 21:23

@erincerol это было очень полезно, мне нужно было использовать Expression <Func <T, object >> orderByPredicated.

Peter Marshall 03.01.2019 20:27

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