如何用NHibernate加载聚合的孙子孙女?

时间:2009-07-16 02:11:10

标签: c# nhibernate performance

我有以下类结构:

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

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

class Action { } 

我想在一个查询中加载TestCase,所有Step和所有Event,并避免选择N + 1问题。

This post解决了使用Step加载TestCase s(使用IMultiQuery)的问题,但我如何加载Action

2 个答案:

答案 0 :(得分:1)

你需要在这里小心你的交叉产品。要处理多个深度以进行急切提取,您需要使用&lt; set&gt;而不是&lt; bag&gt;或&lt; list&gt;。这将保证您的测试用例中没有重复的“步骤”。最后,要使其工作,请使用以下内容:


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

答案 1 :(得分:0)

您可以完全按照所讨论的帖子进行讨论。只需Add第3个标准进入第2个标准,而不是第2个标准。

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