NHibernate — требует загрузки сгруппированного объекта при агрегировании

#nhibernate #aggregate #eager-loading

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

Сам запрос, похоже, работает нормально — за исключением того, что возвращаемый аукцион оценивается лениво, вызывая сценарий выбора N 1. Может кто-нибудь предложить, как можно быстро оценить это поле?

Заранее спасибо

JP

Ответ №1:

Способ грубой силы был бы (похож на подвыбор):

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

Комментарии:

1. Но это не возвращает мою статистику, это просто возвращает сами аукционы … верно?

2. Он помещает аукционы в кэш 1-го уровня, что позволяет избежать проблемы ВЫБОРА N 1 при доступе к вашим аукционам. Вы должны выполнить этот запрос сразу после первого. Обратите внимание, что я ни во что не помещаю результат — по сути, только помещаю их в кеш для последующего доступа.