3

我有一个基本架构

Post {
    Labels: [
        { Text: "Mine" }
        { Text: "Incomplete" }
    ]
}

我正在查询 raven,询问所有带有“我的”和“不完整”标签的帖子。

queryable.Where(candidate => candidate.Labels.Any(label => label.Text == "Mine"))
    .Where(candidate => candidate.Labels.Any(label => label.Text == "Incomplete"));

这会导致 raven 查询(来自 Raven 服务器控制台)

Query: (Labels,Text:Incomplete) AND (Labels,Text:Mine)
Time: 3 ms
Index: Temp/XWrlnFBeq8ENRd2SCCVqUQ==
Results: 0 returned out of 0 total.

为什么是这样?如果我查询包含“不完整”的 JUST,我会得到 1 个结果。如果我查询 JUST 包含“我的”,我得到相同的结果 - 那么为什么我同时查询它们,我得到 0 个结果?

编辑:

好的-所以我走得更远了。“自动生成的索引”看起来像这样

from doc in docs.FeedAnnouncements
from docLabelsItem in ((IEnumerable<dynamic>)doc.Labels).DefaultIfEmpty()
select new { CreationDate = doc.CreationDate, Labels_Text = docLabelsItem.Text }

所以,我认为查询基本上是在测试相同标签的 2 个不同值。坏的。

我把它改成这样:

from doc in docs.FeedAnnouncements
from docLabelsItem1 in ((IEnumerable<dynamic>)doc.Labels).DefaultIfEmpty()
from docLabelsItem2 in ((IEnumerable<dynamic>)doc.Labels).DefaultIfEmpty()
select new { CreationDate = doc.CreationDate, Labels1_Text = docLabelsItem1.Text, Labels2_Text = docLabelsItem2.Text }

现在我的查询(在 Raven Studio 中)Labels1_Text:Mine AND Labels2_Text:Incomplete有效!

但是,从 Linq 查询时,如何处理这些幻像字段(Labels1_Text 和 Labels2_Text)?

4

1 回答 1

1

亚当,你的理由是对的。默认索引将生成 2 个索引条目,并且您的查询在单个索引条目上执行。

你想要的是要么使用交集,要么像这样创建自己的索引:

from doc in docs.FeedAnnouncements
select new { Labels_Text = doc.Labels.Select(x=>x.Text)}

这将在单个索引条目中为您提供所有标签的文本,您可以对其执行查询。

于 2012-05-01T05:00:24.680 回答