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


Хорошо, поигравшись, я пришел к следующему решению. Создан новый метод и:
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;
}
@johnnyarguelles У меня есть что-то вроде; await CosmosDBRepository<X>.GetItemsWithOrderByAsync(n => {actualPredicate}, n => n.CreatedDate, count); Надеюсь, что это поможет
@erincerol это было очень полезно, мне нужно было использовать Expression <Func <T, object >> orderByPredicated.
Ваше решение - именно то, чего я пытаюсь достичь. Можете ли вы поделиться своим кодом, который вы использовали для создания выражения orderByPredicated? Вот где я борюсь. Я знаю, как построить предикат для элемента Where, но не для элемента OrderBy.