2009-07-16 116 views
1

我有下面的类结构:如何用NHibernate加载一个聚集的孙子孙女?

class TestCase { 
    public IList<Step> Steps { get; set; } 
} 

class Step { 
    public IList<Action> Actions { get; set; } 
} 

class Action { } 

我想加载一个TestCase,所有Step s和所有Event S IN一个查询,避免选择N + 1点的问题。

This post解决了TestCase秒(使用IMultiQuery)加载Step S的问题,但我怎么会加载Action太?

回答

1

你需要小心你的交叉产品。要处理超过一个深度的抢先取水,您需要使用集合<集合>而不是<包包>或<列表>。这将保证您的测试用例中没有重复的“步骤”。最后,使用以下方法:


var result = session.CreateCriteria(typeof (TestCase)) 
       .CreateAlias("Steps", "s") 
       .CreateAlias("s.Actions", "a") 
       .SetResultTransformer(CriteriaUtil.DistinctRootEntity); 
       .List(); 
0

您可以完全按照所讨论的内容进行操作。只是Add第二个标准的第二条件,而不是他们在第一条标准。

var result = session.CreateMultiCriteria() 
      .Add(criteria1 
       .Add(criteria2) 
      ) 
      .List();