Azure cosmosdb DocumentDb:获取第一个文档

Azure cosmosdb DocumentDb:获取第一个文档,azure-cosmosdb,Azure Cosmosdb,有没有有效的方法从查询中获取第一个文档?通常,这将与LINQ collects或SQL中的TOP一起使用FirstOrDefault 假设集合看起来像这样: { name: "John", position: 3 }, { name: "Mary", position: 1 }, { name: "Peter", position: 2 } 我只需要检索具有最高值位置的单个文档。即本案中的玛丽文件 使用C SDK,我必须执行如下操作: Clien

有没有有效的方法从查询中获取第一个文档?通常,这将与LINQ collects或SQL中的TOP一起使用FirstOrDefault

假设集合看起来像这样:

{
    name: "John",
    position: 3
},
{
    name: "Mary",
    position: 1
},
{
    name: "Peter",
    position: 2
}
我只需要检索具有最高值位置的单个文档。即本案中的玛丽文件

使用C SDK,我必须执行如下操作:

Client.CreateDocumentQuery<T>(Collection.DocumentsLink)
    .Where(somethingOtherCriteria);
    .OrderByDescending(x => x.Position)
    .AsEnumerable()
    .FirstOrDefault());
这将在应用相关筛选器并从列表中获取第一个文档后检索集合中的所有文档。这仍然可能通过网络带来数千份不相关的文件


无法在服务器上执行FirstOrDefault吗?

一个选项是将最大响应大小设置为1,并仅从查询迭代器获取第一页:

var query=client.CreateDocumentQuerycollectionLink,从myCollection中选择*new FeedOptions{MaxItemCount=1}.AsDocumentQuery; var feedResponse=await query.ExecuteNextAsync;
您正在寻找Take,这是在查询中映射到TOP的Linq函数。所以你想要像这样的东西

        var query = client.CreateDocumentQuery<MyType>(collectionAddress)
            .Where(x => x.Value == myValue)
            .Take(1);

你很接近。跳过AsEnumerable并执行以下操作:

var query = Client.CreateDocumentQuery<T>(Collection.DocumentsLink)
    .Where(somethingOtherCriteria);
    .OrderByDescending(x => x.Position)
    .AsDocumentQuery();

while (query.HasMoreResults)
    foreach (var document in await q.ExecuteNextAsync<T>(cancellationToken))
        return document;
如果您这样做,您实际上不会返回任何结果,而是返回您想要的结果。问题是,在得到包含所需结果的页面之前,您必须对每个结果页面运行ExecuteExtAsync,但其他结果不会经过连接,也不会反序列化为C引用类型。

根据


我不想这么说,但这是不对的。我不怪你这么想,因为我也这么想,直到我发现事实并非如此,这让我非常懊恼。ExecuteExtAsync按查询而不是结果集筛选页面。巧合的是,上面的代码可以工作,因为没有WHERE子句。如果您的查询包含一个WHERE子句,该子句排除了所有第一页,或者在本例中是单个结果,因为您使用的页面大小为1,因此即使存在结果,也无法返回结果。
Client.CreateDocumentQuery<T>(Collection.DocumentsLink)
    .Where(somethingOtherCriteria);
    .OrderByDescending(x => x.Position)
    .Take(1)
    .AsEnumerable()
    .FirstOrDefault());