#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 при доступе к вашим аукционам. Вы должны выполнить этот запрос сразу после первого. Обратите внимание, что я ни во что не помещаю результат — по сути, только помещаю их в кеш для последующего доступа.