CosmosDB通用OrderBy查询或首先获取最后一个数据

时间:2018-04-26 11:40:18

标签: sql linq azure azure-cosmosdb

当我第一次创建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。

1 个答案:

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