Question

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:

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

A partir de données sources 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é en mesure de comprendre comment réaliser ce type de requête via NHibernate ICriteria. Des pensées?

Était-ce utile?

La solution

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top