Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tree RavenDB StartsWith Linq(物化路径)_Tree_Ravendb - Fatal编程技术网

Tree RavenDB StartsWith Linq(物化路径)

Tree RavenDB StartsWith Linq(物化路径),tree,ravendb,Tree,Ravendb,此查询失败(RavenDB 1.0.701) var items=RavenSession.Query().Where(x=>“161 193”.StartsWith(x.MaterializedPath)).ToList(); 还有别的办法吗 在您询问之前,我正在尝试获取具有a的树结构数据的父级(祖先)。在RavenDB中不能这样做-您要查询的字段必须位于谓词的左侧,而谓词的右侧不能引用其他字段 至于如何重组,对不起,不确定 编辑: 好的,这需要一些实验——但如果可以重构Materializ

此查询失败(RavenDB 1.0.701)

var items=RavenSession.Query().Where(x=>“161 193”.StartsWith(x.MaterializedPath)).ToList();
还有别的办法吗


在您询问之前,我正在尝试获取具有a的树结构数据的父级(祖先)。

在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();
希望有帮助

编辑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的强大功能是快速搜索

Map = docs => from n in docs
              let allPaths = n.MaterializedPath.Split(new char[]{' '})
              from path in allPaths 
              select new
              {
                 Path = path
              };

另外,“path”表示一个唯一的文档ID

也很重要-为什么不在这个谓词中翻转一下呢。它应该有效地做同样的事情,还是我遗漏了什么?“abc”以“abb”开头,“abc”不以“abc”开头。我听到了,但我相信有一种方法可以做到这一点,因为RavenDB是基于Lucene的(Lucene作为全文搜索引擎必须能够做到这一点)。。。也许是RavenDB高级Lucene查询?我只是在想。。。如果可以重构到字典或列表的路径,那么可以基于列表中的位置构建谓词。这对你有用吗?用一个有效的例子更新了我的答案。如果Lucene有办法做到这一点,那就太好了——但我不知道。回答得很好。起初我认为它可以工作,但不幸的是,标签和树有点不同。
Found Items: 2
Item Name Foo2, Path = [0, A] [1, B]
Item Name Foo4, Path = [0, A] [1, B] [2, C] [3, D]
    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);
    }
Map = docs => from n in docs
              let allPaths = n.MaterializedPath.Split(new char[]{' '})
              from path in allPaths 
              select new
              {
                 Path = path
              };