2009-12-09 47 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

什么是您的映射是什么样子? – 2009-12-09 15:03:13

回答

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在问题providfed的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)