如何在将子集合实体加入关联时急切地获取子集合

时间:2010-06-10 21:11:51

标签: nhibernate hql icriteria eager-loading

假设以下虚构布局

Dealership
  has many Cars
     has a Manufacturer

我想写一个查询,上面写着给我一个名字为X的经销商,并获得汽车收藏,但在你这样做的时候使用联盟对付制造商。我认为这需要使用ICriteria。我在想这样的事情......


var dealershipQuery = Session.CreateCriteria< Dealership>("d")
                             .Add(Restrictions.InsenstiveLike("d.Name", "Foo"))
                             .CreateAlias("d.Cars", "c")
                             .SetFetchMode("d.Cars", FetchMode.Select)
                             .SetFetchMode("c.Manufacturer", FetchMode.Join)
                             .UniqueResult< Dealership>();

但结果查询看起来并不像我预期的那样。我开始认为某个地方可能需要DetachedCriteria,但我不确定。

思想?

1 个答案:

答案 0 :(得分:3)

在同一查询中提取集合几乎不是最佳解决方案。

此链接详细介绍了最佳方法之一:http://ayende.com/Blog/archive/2010/01/16/eagerly-loading-entity-associations-efficiently-with-nhibernate.aspx

就个人而言,我首选的解决方案是在集合和实体中使用batch-size,设置为我的默认页面长度的大小。这样,上面的查询将使用3个便宜的,可单独缓存的查询来完成,而不是昂贵的查询。