1

在选择父集合时,我遇到了为子集合中的每个项目生成单独的 sql 查询的问题。

我有一个带有 IList 子对象集合的父对象。

如果我使用 linq 运行以下代码来休眠: IList parents = _repository.ToList();

我得到如下的 sql 语句:

SELECT * FROM Parent
SELECT * FROM Child WHERE ParentId = 1
SELECT * FROM Child WHERE ParentId = 2
SELECT * FROM Child WHERE ParentId = 3
SELECT * FROM Child WHERE ParentId = 4
etc etc

这显然效率极低,并假设它一定与映射文件有关?

下面是 Child 集合的映射:

<bag name="Children" lazy="false" table="Child" cascade="all-delete-orphan">
  <key column="ParentId"/>
  <one-to-many class="Child" />
</bag>

相信这是某个地方的新手错误。

任何帮助都非常感谢。

小号

4

2 回答 2

0

看看这个Linq for NHibernate and fetch mode of eager loading。如果您的子集合始终需要在上下文中,您可以在映射文件中管理您的获取策略。但是,NH 最佳实践建议不要这样做。相反,我们总是让集合保持惰性,并在适当的地方为查询设置获取策略。

于 2009-10-30T19:21:32.497 回答
0

这完全取决于 _repository.ToList() 在幕后所做的事情。您可以通过类似于以下的 HQL 语法强制“急切”地获取您的集合:

"from Parent inner join fetch Children"

HQL 语句旨在灵活,因此它们往往会忽略您流畅地定义或在 hbm xml 文件中定义的集合映射和连接策略。

您现在应该只看到对数据库执行的单个查询。

于 2009-09-18T13:50:16.677 回答