sql - CosmosDB 通用 OrderBy 查询或先获取最后一条数据
问题描述
第一次创建 CosmosDB 时,我正在使用来自 azure 项目的代码。它有一个很好的通用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;
}