我有一个如下的实体:
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));
如何创建正确的查询?
答案 0 :(得分:1)
您需要为此类查询创建索引。
在索引中,您应该展平您的OptOut集合,以便在其上创建查询。
更多相关内容:
How to query items from nested collections in 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值的人员文件。
令人沮丧的是,如何在查询(键入的客户端)中找不到它,但我们可以继续在邮件列表上进行讨论。