2010-06-10 24 views
0

假设以下虚构的布局如何急于取一个子集合,同时加入子集合实体关联

 
Dealership 
    has many Cars 
    has a Manufacturer 

我想编写一个查询,说让我一个经销商与X的名称并同时获得Cars系列,但是当你这样做的时候使用一个加入制造商的联盟。我认为这需要使用IC标准。我在想这样的事情..

 

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可能需要某处,但我不确定。

想法?

回答

2

在相同的查询中提取集合几乎从来都不是最好的解决方案。

一个最好的方法之一是在这个环节详细:http://ayende.com/Blog/archive/2010/01/16/eagerly-loading-entity-associations-efficiently-with-nhibernate.aspx

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

+0

我应该提到我们使用的是较旧的Oracle,因此批处理大小不起作用。 – 2010-06-11 13:59:04

+0

另外我不想从经销商那里得到两个系列。我希望Cars能够加载它的制造商。您发送的链接与单个根目录中的多个收藏集关联更多。 – 2010-06-11 14:04:08

+0

实体和集合的'batch-size'适用于所有数据库。 Ayende的解决方案适用于任何数量的收藏;这个想法是,你在一个查询中获得根,在另一个查询中获得集合。 – 2010-06-11 16:25:36