首页 > 解决方案 > 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。

标签: sqllinqazureazure-cosmosdb

解决方案


好的,在玩了之后,我想出了以下解决方案。创建了新方法并:

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

推荐阅读