gpt4 book ai didi

nhibernate - 急切加载递归关系

转载 作者:行者123 更新时间:2023-12-03 12:24:26 27 4
gpt4 key购买 nike

我有一个递归的一对多关系,它的默认惰性值为 true。我可以针对 NH API 编写哪些代码来有效地检索整个树,就像我在 SubCategories 映射上有 lazy="false"一样?

这是递归的一对多关系:

<class name="Category" lazy="false">
...
<list name="SubCategories" fetch="subselect">
<key column="ParentCategoryID"/>
<index column="PositionInList"/>
<one-to-many class="Category"/>
</list>

我没有在列表中指定 lazy="false",因为我需要运行的大约一半的查询都需要惰性。我在列表上有 fetch="subselect"作为优化,以便我设法检索整个树。

我试过 ICriteria API:
session.CreateCriteria<Category>().SetFetchMode( "SubCategories", FetchMode.Eager ).Add( Restrictions.IsNull("ParentCategory") ).SetResultTransformer( CriteriaSpecification.DistinctRootEntity ).List<Category>();

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

最佳答案

请参阅 Ayende 的网站:Efficiently Selecting a Tree .我已经在我自己的应用程序中成功地使用了这种技术。使用 ICriteria,它看起来像这样:

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

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

关于nhibernate - 急切加载递归关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1223163/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com