2009-12-09 21 views
0

Dans un tableau qui stocke plusieurs lignes par employé, je veux tirer une ligne par employé qui représente l'entrée la plus récente pour chaque employé. Voici où je suis avec SQL écrit à la main:NHibernate + joindre à la table dérivée

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 

à partir de données source comme ceci:

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

Ça va me donner quelque chose comme ceci:

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

Je n'ai pas été capable de comprendre comment accomplir ce type de requête via NHibernate ICriteria. Des pensées?

+0

À quoi ressemble votre carte comme? –

Répondre

2

Voici ce que vous devez faire:

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

Ce n'est pas equilevant à la requête SQL providfed dans la question, mais il fait exactement la même chose.

La requête SQL qui est généré par la requête de critères ci-dessus est:

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)