Мне нужно написать следующее SQL как Свободный критерий NHIbernate для поддержки порядка и подкачки. Я чувствую, что я действительно близко.
SELECT stats.*
FROM
ItemStatistic stats
INNERJOIN
( SELECT admin.AdministrationCode, is.ItemStatisticId,
RANK() OVER(Partition BY admin.AdministrationCode ORDERBY is.StatDate DESC) AS RowNm
FROM
ItemStatistic is
INNERJOIN ItemInstance ii ON ii.ItemInstanceId = is.ItemInstanceId
INNERJOIN Administration admin ON ii.AdministrationId = admin.AdministrationId
WHERE
ii.itemId = @ItemId
) sub ON stats.ItemStatisticId = sub.ItemStatisticId AND sub.RowNm = 1
Я создал подзапрос в качестве отдельного критерия следующим образом
var subQuery = DetachedCriteria.For(typeof(ItemStatistic), "stats")
.CreateAlias("stats.ItemInstance", "ii")
.CreateAlias("ii.Administration", "admin")
.SetProjection
(
Projections.SqlProjection(
"stats.ItemStatisticId, RANK() OVER(Partition BY admin.AdministrationCode ORDER BY stats.StatDate DESC) AS RowNm",
new string[] { "ItemStatisticId", "RowNm" },
new IType[] { NHibernate.NHibernateUtil.Int32, NHibernate.NHibernateUtil.Int32 }
)
)
.Add(Restrictions.Eq("ii.ItemId", itemId));
Но я не могу понять, как внутреннее соединение подзапрос. Я думаю, что это будет похоже на следующее, которое не работает. Возможно, мне просто нужно понять, как псевдоним подзапроса?
var criteria = Session.CreateCriteria<ItemStatistic>("is")
.Add(Subqueries.Eq("ItemStatisticId", subQuery) // need alias for subquery aka sq ?
.Add(Restrictions.Eq("sq.RowNm", 1)));
.Add(Restrictions.Eq("is.ItemStatisticId", "sq.ItemStatisticId"))