Внутреннее присоединение к подзапросу с свободно используемыми критериями NHibernate и DetachedCriteria - PullRequest
2 голосов
/ 23 февраля 2020

Мне нужно написать следующее 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"))
...