是否有一种从查询中获取第一个文档的有效方法?通常,这将使用LINQ收集的FirstOrDefault()
或SQL中的TOP
。
假设集合看起来像这样:
{
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()
?
答案 0 :(得分:2)
一个选项是将最大响应大小设置为1,并仅从查询迭代器中获取第一页:
var query = client.CreateDocumentQuery<Family>(collectionLink, "SELECT * FROM myCollection", new FeedOptions { MaxItemCount = 1 }).AsDocumentQuery();
var feedResponse = await query.ExecuteNextAsync<Family>();
答案 1 :(得分:0)
您正在寻找Take(),这是在查询中映射到TOP的Linq函数。所以你想要像
这样的东西 var query = client.CreateDocumentQuery<MyType>(collectionAddress)
.Where(x => x.Value == myValue)
.Take(1);
答案 2 :(得分:0)
您已经关闭。跳过AsEnumerable()并执行以下操作:
List<Integer> buffet = Collections.synchronizedList(new ArrayList<>());
...
while (true) {
synchronized (buffet) {
// perform your operations
}
}
如果以这种方式执行操作,则实际上不会返回任何结果,而是您想要的结果。问题是,您必须对结果的每一页都运行ExecuteNextAsync(),直到获得具有所需结果的页面为止-但其他结果不会通过网络传递,也不会反序列化为C#引用类型
答案 3 :(得分:0)
Client.CreateDocumentQuery<T>(Collection.DocumentsLink)
.Where(somethingOtherCriteria);
.OrderByDescending(x => x.Position)
.Take(1)
.AsEnumerable()
.FirstOrDefault());