【问题标题】:NHibernate - Eager loading grouped object when aggregatingNHibernate - 聚合时急切加载分组对象
【发布时间】:2011-12-03 07:34:43
【问题描述】:

我有以下代码,我从统计表汇总拍卖统计数据并返回拍卖以及总计数(每次拍卖的统计表中可能有多行...)

   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[]>();

查询本身似乎工作正常 - 除了返回的 Auction 被延迟评估,导致 SELECT N+1 场景。谁能提供有关如何热切评估该领域的建议?

提前致谢

日本

【问题讨论】:

    标签: nhibernate aggregate eager-loading


    【解决方案1】:

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

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

    【讨论】:

    • 但这并没有恢复我的统计数据,它只是恢复了拍卖本身......对吗?
    • 它将拍卖放入第一级缓存 - 在您访问拍卖时避免 SELECT N+1 问题。您应该在第一个查询之后运行该查询。请注意,我没有将结果放入任何内容中 - 基本上只是将它们放入缓存中以供以后访问。
    猜你喜欢
    • 1970-01-01
    • 2011-05-23
    • 2017-10-19
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多