当我只需要计数而不读取 Document-Db 数据库中的所有文档时,如何使用 Linq 构造 IQueryable 查询?

How to construct IQueryable query using Linq when I just need count without reading all documents in Document-Db database?

我需要我的 Azure Cosmos Db 数据库中一个集合中存储的文档数。如何在 IQueryable 对象上使用 LINQ 查询获取计数?

docDbClient.CreateDocumentQuery<TResult>().Count()

如果我这样做,我无法用 .AsDocumentQuery() 方法跟进。

这是我的异步实现(使用 Count,用于同步版本):

var count = await DocumentClient.
            CreateDocumentQuery<T>(CreateCollectionUri(), CreateFeedOptions()).
            Where(predicate).
            CountAsync();

其中谓词是 Expression<Func<T, bool>>

您可以尝试使用以下代码来统计您collection中的文档数量。

client = new DocumentClient(new Uri(EndpointUri), PrimaryKey);

IQueryable<int> total = client.CreateDocumentQuery<int>(UriFactory.CreateDocumentCollectionUri("testdb", "testcoll"), "SELECT Value count(1) FROM c", new FeedOptions() { EnableCrossPartitionQuery = true });

Console.WriteLine("total: " + total.AsEnumerable().FirstOrDefault());

查询结果:

如果您捕获请求(使用 fiddler 等),您会发现当您执行代码时,客户端 sdk 向服务器发送相同的查询 {"query":"SELECT VALUE [{\"item\": Count(1)}]\r\nFROM root"} docDbClient.CreateDocumentQuery<TResult>().Count().

另一种实现方式是:

using Microsoft.Azure.Cosmos.Linq; // required for CountAsync()
//...
cosmosClient
    .GetContainer(databaseName, containerName)
    .GetItemLinqQueryable<MyRecord>(true)
    .Where(r => r.Name == "John")
    .Where(r => r.Status == MyRecordStatus.Approved)
    .CountAsync()