在选择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>
相信这是某个新手的错误。
任何帮助都非常感激。
取值
答案 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最佳实践建议不要这样做。相反,我们总是将集合保持惰性,并在适当的时候在查询上设置提取策略。