【问题标题】:nhibernate query with child entities and lazy="false"带有子实体和lazy="false" 的休眠查询
【发布时间】:2009-11-12 02:41:51
【问题描述】:

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

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

如果我使用 linq 运行以下代码来休眠: IList 父母 = _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>

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

任何帮助都非常感谢。

S

【问题讨论】:

    标签: linq nhibernate linq-to-nhibernate


    【解决方案1】:

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

    "from Parent inner join fetch Children"
    

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

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

    【讨论】:

    • 它使用 linq 休眠,如下所示: var query = (from p in session.Linq() select p).ToList();我知道 fetch Strat 是由映射文件中的“lazy”属性管理的?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 2012-03-17
      • 2017-02-13
      • 2020-08-10
      • 1970-01-01
      相关资源
      最近更新 更多