2009-12-09 2 views
0

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

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. Есть предположения?

+0

Что делает ваше картирование выглядеть? –

ответ

2

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

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>(); 

Это не equilevant на запрос SQL providfed в вопросе, но это не совсем то же самое.

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) 

 Смежные вопросы

  • Нет связанных вопросов^_^