9

我正在尝试使用选择热切地获取集合,但我得到的只是内部连接。到底是怎么回事?

Session.CreateCriteria(typeof(Foo))
    .SetFetchMode("Bars", FetchMode.Select)
    .CreateAlias("Bars", "b")
    .SetFetchMode("b.Bazes", FetchMode.Select)
    .List();

我尝试将 FetchMode 更改为 Eager 但这不起作用 - 我仍然得到内部连接而不是单独的选择。我不确定它从哪里获得内部连接,因为文档中没有任何内容谈到 FetchMode 导致内部连接。是否有可能获得急切的选择?

更新 确定我发现创建别名会导致内部连接。所以我可以使用 .CreateAlias("Bars", "b", JoinType.None),但是b.Bazes的获取会恢复为延迟加载。呃。

4

3 回答 3

1

INNER JOIN 是 NHibernate 加载您的记录及其相关子记录的方式。这通常是最有效的方法。

如果要使用多个 SELECT 语句,那么对子项的查询将需要以某种方式包含父项的条件。INNER JOIN 可以很容易地获得相关的子节点,NHibernate 会在运行查询后正确地将其拆分为多个实体。

我相信 Entity Framework 4 将允许您执行多个查询并“神奇地”重新附加相关对象,但我不知道 NHibernate 具有这样的功能(如果我在这方面错了,我相信有人会纠正我) .

于 2009-12-15T04:39:07.737 回答
1

对于 nhibernate 到渴望加载实体,使用左外连接。因此,您需要像这样更改代码:

Session.CreateCriteria(typeof(Foo))
.SetFetchMode("Bars", FetchMode.Select)
.CreateAlias("Bars", "b", JoinType.LeftOuterJoin)
.SetFetchMode("b.Bazes", FetchMode.Select)
.List();

它在类似的情况下帮助了我。

于 2010-11-05T06:40:18.967 回答
0
Session.CreateCriteria(typeof(Foo))
   .SetFetchMode("Bars", FetchMode.Select)
   .CreateAlias("Bars", "b")  <-- this line triggers a join ( think )
   .SetFetchMode("b.Bazes", FetchMode.Select) 
   .List();

如果您真的不想要连接,您可以在映射中指定 fetch="select",但这会导致不推荐的 N+1 选择(每个 Foo 实体选择一个,然后每个 Baze 一个选择)

于 2009-12-15T07:36:07.270 回答