强迫NHibernate中的热切选择

时间:2009-12-15 04:19:04

标签: nhibernate fetching-strategy

我正在尝试使用选择来急切地获取集合,但我只是 获取内部加入。发生了什么事?

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 的提取将恢复为延迟加载。 Urgh。

3 个答案:

答案 0 :(得分:1)

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

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

我相信实体框架4会让你做多个查询并“神奇地”重新附加相关对象,但我不知道NHibernate有这样的功能(我相信如果我错了会有人纠正我在此)。

答案 1 :(得分:1)

对于nhibernate到eager load实体,使用左外连接。所以你需要改变你的代码:

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

它在similar scenario帮助了我。

答案 2 :(得分: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选一个)