2011-10-07 59 views
0

我有以下代码,我从统计表中聚合了拍卖统计信息,并返回了拍卖以及总计数(每个拍卖可能有多个统计表中的行.. )NHibernate - 在聚合时急切加载分组对象

var stats = _session.QueryOver<AuctionStatistic>() 
     .Select(
      Projections.Group<AuctionStatistic>(s => s.Auction), 
      Projections.Sum<AuctionStatistic>(s => s.BidCount), 
      Projections.Sum<AuctionStatistic>(s => s.ViewCount), 
      Projections.Sum<AuctionStatistic>(s => s.SearchCount) 
     ) 
     .OrderBy(Projections.Sum<AuctionStatistic>(s => s.ApplicationCount)).Desc 
     .Fetch(x => x.Auction).Eager 
     .Take(take) 
     .List<object[]>(); 

查询本身似乎工作正常 - 除了返回的拍卖延迟评估,导致SELECT N + 1场景。任何人都可以提供关于如何热切评估这个领域的建议吗?

在此先感谢

JP

回答

0

蛮力方法是(类似于子选择):

_session.QueryOver<Auction>().WhereRestrictionOn(a => a.Id).IsIn(stats.SelectMany(s => s).OfType<Auction>().Select(a => a.Id).ToArray()); 
+0

但这并不带回我的统计,它只是带来支持拍卖自己......对吗? –

+0

它将拍卖放入一级缓存 - 避免您在访问拍卖时出现SELECT N + 1问题。您应该在第一个之后运行该查询。请注意,我不会将结果放入任何内容 - 实质上只是将它们放入缓存中供以后访问。 – Goblin