【发布时间】:2013-08-19 14:57:39
【问题描述】:
我从 Raven DB 得到了一个奇怪的(非)结果。
我正在客户端和服务器上运行最新的稳定版本 v2.5.2666。
我要检索的是“第一个包含 Id 值为 'x' 的 Component 对象的 DeployProject 文档”。
所以我尝试的第一件事是:
var project = _documentSession.Query<DeployProject>()
.FirstOrDefault(i=>i.ComponentList.Any(j=>j.Id == componentId));
但返回 null,即使我知道数据是正确的。为了验证我没有发疯,我在中间添加了一个 .ToList(),所以它会将所有文档拉出到内存中查询它。
var project = _documentSession.Query<DeployProject>()
.ToList()
.FirstOrDefault(i=>i.ComponentList.Any(j=>j.Id == componentId));
那确实有效,所以我的逻辑和数据是正确的。但是当然它确实效率很低,整个想法是我只想拉出包含相关子记录的单个文档。
所以 Raven 查询索引的方式肯定存在问题,因为数据肯定在那里,如果我将所有内容都拉入内存并运行相同的 LINQ 查询,我可以检索它。
我的希望(恐惧?)是索引过时了,所以我告诉它给我新的数据:
var project = _documentSession.Query<DeployProject>()
.Customize(i=>i.WaitForNonStaleResultsAsOfLastWrite())
.FirstOrDefault(i=>i.ComponentList.Any(j=>j.Id == componentId));
但我又一次得到了空值。似乎 Raven 只是没有按照我期望的方式处理 LINQ 语句,即 LINQ to objects 的工作方式。我知道可能存在一些差异,但这应该是一个非常简单的查询,我希望它可以工作。
有人有什么想法吗?我错过了一些简单的东西吗?
编辑:根据 Raven 的文档,这似乎应该在没有任何冒险索引的情况下工作:
http://ravendb.net/docs/client-api/querying/using-linq-to-query-ravendb
除了 Where 子句,还有其他几个有用的运算符 您可以用来过滤结果。
Any 可用于您的对象集合(或原始列表) 实体仅返回满足条件的实体。 RavenDB 也 支持 In 运算符,使反向任何比较更容易:
// Return only companies having at least one employee named "Ayende"
IQueryable<Company> companies = from c in session.Query<Company>()
where c.Employees.Any(employee => employee.Name == "Ayende")
select c;
【问题讨论】:
-
投反对票?真的吗?有什么原因吗?
-
在我看来,投反对票的是不理解问题的人。