当我第一次创建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中有几个集合,并且字段不同。当我想列出其中一个收藏品时,我只想获得最新的收藏品。
所以在这个例子中,我实际上将count计为50,所以我只得到50,但我也想得到最近的。上面的代码按预期返回最旧的50。这有什么解决方案吗?我猜可能有办法先获取最新数据,当我打电话给50时,这将是最新的50条记录。
我尝试过的其他方法是创建另一个名为GetItemsWithOrderByAsync
的方法并试图给出Expression&gt;,但它需要在整个类中进行大量修改以支持TKey。
答案 0 :(得分:2)
好的,玩完之后,我想出了以下解决方案。创建了新方法并且:
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;
}