此查询失败(RavenDB 1.0.701)
var items= RavenSession.Query<Item>().Where(x => "161 193".StartsWith(x.MaterializedPath)).ToList();
还有其他办法吗?
在你问之前,我正试图让父母(祖先)获得一个materialized path (lineage column)的树状结构数据。
答案 0 :(得分:2)
你不能在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:
我在Item上的构造函数看起来像这样,只是为了便于测试:
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);
}
答案 1 :(得分:1)
我建议建立一个包含搜索各种可能性的索引。这将在索引中创建大量项目,但同时Lucene能够快速搜索
Map = docs => from n in docs
let allPaths = n.MaterializedPath.Split(new char[]{' '})
from path in allPaths
select new
{
Path = path
};
“path”代表唯一文档ID
非常重要