RavenDB对子对象的任何查询返回不正确的结果

时间:2017-02-16 10:08:41

标签: c# linq ravendb

我有一个RavenDB查询,用于搜索文档中的活跃用户。

普通查询如下所示:

var documents = session.Query<Document>().Where(d => d.Users.Any(u => u.Id == UserId && u.Active == true)).ToList();

自动生成的查询如下所示:

from doc in docs.Documents
select new {
    Users_Active = (
        from docUsersItem in ((IEnumerable<dynamic>)doc.Users).DefaultIfEmpty()
        select docUsersItem.Active).ToArray(),
    Users_Id = (
        from docUsersItem in ((IEnumerable<dynamic>)doc.Users).DefaultIfEmpty()
        select docUsersItem.Id).ToArray()
}

但是,这会导致查询返回具有正确用户的文档,但该用户处于非活动状态,只要该文档上有另一个活动用户。

我怀疑这是因为字段被编入索引,结果如下:

AssignedUsers_Id: [1, 2]
AssignedUsers_Active:[false, true]

查询将匹配数组中的Id,并且在Active数组中为true,即使它们在各自的数组中处于不同的索引。

我需要对索引进行哪些更改才能使其仅返回UserId正确且处于活动状态的文档?

为了避免将来使用自动索引,有什么方法可以重写我的LINQ查询,以便它能正确索引和执行吗?

1 个答案:

答案 0 :(得分:1)

这是自动索引的设计行为。您可以通过定义自己的索引来避免此行为,索引将在文档上为每个用户发出索引条目。

这是自动索引的默认行为的原因是,在绝大多数情况下,它对用户来说并不重要,但它在服务器端具有极高的潜在成本,因此我们希望用户做出明确的决定。