3

私は基本的なスキーマを持っています

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

そして、「私のもの」と「不完全」の両方のラベルが付いたすべての投稿を求めるために、レイヴンに問い合わせています。

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 つの結果が得られます。「Mine」を含む 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つのインデックスエントリを生成し、クエリは1つのインデックスエントリで実行されます。

必要なのは、交差を使用するか、次のように独自のインデックスを作成することです。

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

そして、それはあなたがクエリを実行することができる単一のインデックスエントリであなたにすべてのラベルのテキストを与えるでしょう。

于 2012-05-01T05:00:24.680 に答える