查找集合中没有字符串的文档

时间:2013-08-26 13:07:25

标签: linq ravendb

我有一个如下的实体:

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));

如何创建正确的查询?

1 个答案:

答案 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值的人员文件。

令人沮丧的是,如何在查询(键入的客户端)中找不到它,但我们可以继续在邮件列表上进行讨论。