1

我有一个如下实体:

class Person
{
    public ICollection<string> OptOut { get; set; }
    //other fields
}

我的应用程序允许用户基于Person.

客户应该能够选择退出不同的邮件列表,因此OptOut可能包含类似[ "Marketing", "Financial" ].

对特定邮件列表的查询当前聚合了过滤器表达式(使用Queryable.Where),RavenDB 可以毫无问题地创建所需的索引。

我一直在阅读,似乎这些构造都不支持:

people.Where(x => !x.OptOut.Contains(mailingListType));
people.Where(x => !x.OptOut.Any(o => o == mailingListType));
people.Where(x => x.OptOut.All(o => o != mailingListType));

如何创建正确的查询?

4

1 回答 1

1

您需要为此类查询创建索引。

在索引中,您应该展平您的 OptOut 集合,以便您可以在其上创建查询。

更多关于这里:

如何从 Raven DB 的嵌套集合中查询项目?

编辑

似乎这可以通过一个简单的 LuceneQuery 来回答,而无需显式创建和索引。

var users = session.Advanced
                   .LuceneQuery<Person>()
                   .Where("OptOut:* AND -OptOut:" + newsLetterType)
                   .ToList();

编辑 2

您将需要创建此索引:

from doc in docs.People
select new { OptOut = doc.OptOut.Count==0 ? "" : doc.OptOut}

包括没有 OptOut 值的个人文档。

令人沮丧的是,在 Query(类型化客户端)中不提供此功能,但我们可以继续在邮件列表上进行讨论。

于 2013-08-26T16:01:29.633 回答