Linq 具有子实体的nhibernate查询和lazy=";假;
在选择父项时,我遇到了为子集合中的每个项生成单独sql查询的问题 我有一个具有IList子对象集合的父对象 如果我使用linq to nhibernate运行以下代码: IList parents=_repository.ToList() 我得到如下sql语句:Linq 具有子实体的nhibernate查询和lazy=";假;,linq,nhibernate,linq-to-nhibernate,Linq,Nhibernate,Linq To Nhibernate,在选择父项时,我遇到了为子集合中的每个项生成单独sql查询的问题 我有一个具有IList子对象集合的父对象 如果我使用linq to nhibernate运行以下代码: IList parents=_repository.ToList() 我得到如下sql语句: SELECT * FROM Parent SELECT * FROM Child WHERE ParentId = 1 SELECT * FROM Child WHERE ParentId = 2 SELECT * FROM Child
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
"from Parent inner join fetch Children"
这显然是非常低效的,并且假设它一定与映射文件有关
以下是子集合的映射:
<bag name="Children" lazy="false" table="Child" cascade="all-delete-orphan">
<key column="ParentId"/>
<one-to-many class="Child" />
</bag>
相信我,这是个新手犯的错误
任何帮助都将不胜感激
这完全取决于repository.ToList()在封面下做了什么。您可以通过类似于以下内容的HQL语法强制“急切”获取集合:
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
"from Parent inner join fetch Children"
HQL语句是灵活的,因此它们倾向于忽略您的集合映射和流畅地或在hbm xml文件中定义的联接策略
您现在应该只看到对数据库执行的一个查询。看看这个。如果子集合始终需要位于上下文中,则可以在映射文件中管理获取策略。然而,NH最佳实践建议不要这样做。相反,我们总是让集合保持惰性,并在适当的地方对查询设置抓取策略。它使用linq到nhibernate,如下所示:var query=(从会话中的p.linq()选择p)。ToList();我知道fetch strat是由映射文件中的“lazy”属性管理的?