当我只需要计数而不读取 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()
我需要我的 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()