RavenDBではこれを行うことはできません。クエリ対象のフィールドは述語の左側になければならず、述語の右側は別のフィールドを参照できません。
これを再構成する方法については - 申し訳ありませんが、わかりません。
編集:
さて、それはいくつかの実験をした - しかし、私はそれを再構築MaterializedPathのいずれかに可能ならそれを動作させる、または新しいプロパティを追加することができました。混乱を避けるために、ここでは新しい財産であると仮定します。
// Sample class:
public class Item
{
public string Name { get;set;}
public Dictionary<int, string> Path { get;set;} // Zero-based key on path.
}
// Query: Find nodes with path "A B"
var query = session.Query<Item>().AsQueryable();
query = query.Where(item => item.Path[0] == "A");
query = query.Where(item => item.Path[1] == "B");
var found = query.ToList();
そして、ここで実行されている:
IDocumentStore store = new EmbeddableDocumentStore { RunInMemory = true };
store.Initialize();
// Install Data
using (var session = store.OpenSession())
{
session.Store(new Item("Foo1", "A")); // NB: I have a constructor on Item which takes the path and splits it up. See below.
session.Store(new Item("Foo2", "A B"));
session.Store(new Item("Foo3", "A C D"));
session.Store(new Item("Foo4", "A B C D"));
session.Store(new Item("Foo5", "C B A"));
session.SaveChanges();
}
using (var session = store.OpenSession())
{
var query = session
.Query<Item>().AsQueryable();
query = query.Where(item => item.Path[0] == "A");
query = query.Where(item => item.Path[1] == "B");
var found = query.ToList();
Console.WriteLine("Found Items: {0}", found.Count);
foreach(var item in found)
{
Console.WriteLine("Item Name {0}, Path = {1}", item.Name, string.Join(" ", item.Path));
}
}
をこの出力は次のようになります。
Found Items: 2
Item Name Foo2, Path = [0, A] [1, B]
Item Name Foo4, Path = [0, A] [1, B] [2, C] [3, D]
お役に立てば幸いです。
編集2:私は、検索の可能性のそれぞれが含まれていますインデックスを構築提案ます
public Item(string name, string materializedPath)
{
Name = name;
var tmpPath = materializedPath.Split(' ');
Path =
tmpPath
.Zip(Enumerable.Range(0, tmpPath.Count()), (item, index) => new {Item = item, Index = index})
.ToDictionary(k => k.Index, v => v.Item);
}
を表していることが重要です速い
を検索するのLuceneの力で、あなたのインデックスが、同じ時間内の項目の多くを作成します。この述語でそれは効果的に同じことをすべきか、私は何かが恋しいのですか? –
"A B C"は "A B"で始まり、 "A B"は "A B C"で始まらない。 –
RavenDBはLucene(Luceneはフルテキスト検索エンジンである必要があります)をベースにしているので、これを行う方法があると確信しています... RavenDBの高度なLuceneクエリのようなものでしょうか? – W3Max