2012-08-03 59 views
2

我有一个简单的类层次结构看起来像这样:使用TransformResults从RavenDB中选择分层数据?

public class Top 
{ 
    public string Id { get; set; } 
    public string Description { get; set; } 
    public List<Middle> Middles { get; set; } 
} 

public class Middle 
{ 
    public string Id { get; set; } 
    public string Description { get; set; } 
    public List<Bottom> Bottoms { get; set; } 
} 

public class Bottom 
{ 
    public string Id { get; set; } 
    public string Description { get; set; } 
} 

整个事情被保存为类型的实体“顶”。文档旨在保留和反映关系/层次结构,但只有一半,但我会仅关注给定关系的“Id”和“Description”。所以,我要运行的查询类型是

  • 选择一切之上,
  • 选择所有中东,
  • 选择中,其中Top.Id = someValue中
  • 选择底,其中Top.Id = someValue中和Middle.Id = someValue中

我想结果进行改造,并返回到我这个样子:

public class Result 
    { 
     public int Id { get; set; } 
     public string Description { get; set; } 
    } 

如何才能实现TransformResults(我认为这是可以使用的功能)?我已经阅读了很多例子,但突然间我看到了参数/值,这些参数/值没有在任何地方声明,因此我不明白发生了什么。

回答

1

TransformResults无法访问外部世界,因此无法根据您运行的查询执行逻辑。 当然,你可以扁平化这个结构,但除非你用不同的TransformResults创建多个索引,否则你不能这样做。 请注意,首先这是一个奇怪的事情,因为它不符合文档的标准建模作为事务边界。

+0

好的,在这种情况下我应该怎么做?我把它分开,把Top,Middle和Bottom作为单独的文件对待?为什么我的方法“奇怪”?它是否过于关系?我只是想了解我做错了什么,做什么是正确的做法。感谢帮助! – user981375 2012-08-06 13:27:30

+0

我想我可能会混淆这些问题。阅读后http://stackoverflow.com/questions/7829379/ravendb-retrieving-part-of-document?rq=1现场投影产生我想要的。如果我指定我的quey像'var top = session.Query .First(t => t.Id.Equals(1))。Middles.Select(m => new {m.Id,m.Description})。ToList ()'然后我得到所有Middles给定的Top.Id,这正是我想要的。以同样的方式,我可以一直导航。这工作得很好,但这是做到这一点的方式? – user981375 2012-08-06 17:11:36