NHibernate + присоединиться к производной таблице

В таблице, в которой хранится несколько строк для каждого сотрудника, я хочу получить одну строку для каждого сотрудника, которая представляет самую последнюю запись для каждого сотрудника. Вот где я с рукописным SQL:

SELECT [all the selected columns here]
FROM   Nominations t
    inner join 
    (select max(NominationId) mostRecentNominationId, 
        EmployeeId from Nominations group by EmployeeId) n
        on n.mostRecentNominationId = t_.NominationId

Из исходных данных так:

nomination_id       employee_id
-------------------------------
1                   5
2                   5
4                   10
7                   10

Это даст мне что-то вроде этого:

nomination_id       employee_id
-------------------------------
2                   5
7                   10

Я не смог понять, как выполнить такой запрос через NHibernate ICriteria. Есть предположения?


person BryanB    schedule 09.12.2009    source источник
comment
Как выглядит ваше отображение?   -  person Nathan Fisher    schedule 09.12.2009


Ответы (1)


Вот что вам нужно сделать:

DetachedCriteria dCriteria = DetachedCriteria.For<Nomination>("nomination")
        .SetProjection(Projections.Max("nomination.Id"))
        .Add(Restrictions.EqProperty("nomination.EmployeeId", "employee.Id"));

var nominations = Session.CreateCriteria<Nomination>("nom")
            .CreateCriteria("Employee", "employee")
            .Add(Subqueries.PropertyEq("nom.Id", dCriteria)).List<Nomination>();

Это не эквивалентно SQL-запросу, указанному в вопросе, но делает то же самое.

SQL-запрос, сгенерированный указанным выше запросом критериев, выглядит следующим образом:

SELECT * 
FROM Nomination nom 
inner join Employee employee on nom.EmployeeId=employee.EmployeeId 
WHERE nom.NominationId = 
(SELECT max(nomination.NominationId) as maxID 
   FROM Nomination nomination  
   WHERE nomination.EmployeeId = employee.EmployeeId)
person tolism7    schedule 09.12.2009