急切加载递归关系

Hap*_*mad 7 nhibernate

我有一个递归的一对多关系,其默认延迟值为true.如果我在SubCategories映射上有lazy ="false",我可以用NH API编写哪些代码来有效地检索整个树?

这是递归的一对多关系:

<class name="Category" lazy="false">
    ...
    <list name="SubCategories" fetch="subselect">
            <key column="ParentCategoryID"/>
            <index column="PositionInList"/>
            <one-to-many class="Category"/>
    </list>
Run Code Online (Sandbox Code Playgroud)

我没有在列表中指定lazy ="false",因为在我需要运行的大约一半查询中需要懒惰.我在列表上有fetch ="subselect"作为我管理检索整个树时的优化.

我已经尝试过ICriteria API:

session.CreateCriteria<Category>().SetFetchMode( "SubCategories", FetchMode.Eager ).Add( Restrictions.IsNull("ParentCategory") ).SetResultTransformer( CriteriaSpecification.DistinctRootEntity ).List<Category>();
Run Code Online (Sandbox Code Playgroud)

但这只是急切地加载了层次结构中的第一级.

Dan*_*ing 8

参见Ayende的网站:有效地选择一棵树.我在自己的应用程序中成功使用了这种技术.使用ICriteria,它看起来像这样:

session.CreateCriteria<Category>()
    .SetFetchMode("SubCategories", FetchMode.Join)
    .SetResultTransformer(new DistinctRootEntityResultTransformer())
    .List<Category>()
    .Where(x => x.ParentCategory == null);
Run Code Online (Sandbox Code Playgroud)

此版本与您尝试的内容之间的主要区别在于如何应用"ParentCategory == null"过滤器.它必须被排除在发送到数据库的查询之外才能检索整个树 - 但我们仍然需要查询只返回树的根节点,所以我们将使用linq来查找数据库查询已完成.