0

従業員ごとに複数の行を格納するテーブルで、各従業員の最新のエントリを表す従業員ごとに 1 つの行を取得したいと考えています。これが私が手書きの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 に答える