我有一个递归的一对多关系,其默认延迟值为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)
但这只是急切地加载了层次结构中的第一级.
参见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来查找数据库查询已完成.
| 归档时间: |
|
| 查看次数: |
2580 次 |
| 最近记录: |