0

在每个员工存储多行的表中,我想为每个员工提取一行,代表每个员工的最新条目。这是我使用手写 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 完成这种类型的查询。有什么想法吗?

4

1 回答 1

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

这与问题中提供的 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)
于 2009-12-09T15:34:48.060 回答