带有子实体的nhibernate查询和lazy =“false”

时间:2009-09-18 13:44:34

标签: linq nhibernate linq-to-nhibernate

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

我有一个带有IList集合的Child对象的Parent对象。

如果我使用linq运行以下代码到nhibernate: 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>

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

任何帮助都非常感激。

取值

2 个答案:

答案 0 :(得分:0)

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

"from Parent inner join fetch Children"

HQL语句应该是灵活的,因此它们倾向于忽略您的集合映射和连接策略,这些策略可以流利地或在hbm xml文件中定义。

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

答案 1 :(得分:0)

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