【问题标题】:NHibernate + join to derived tableNHibernate + 连接到派生表
【发布时间】:2023-03-05 20:53:01
【问题描述】:

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

【问题讨论】:

  • 你的映射是什么样子的?

标签: nhibernate icriteria derived-table


【解决方案1】:

这是你需要做的:

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)

【讨论】:

    猜你喜欢
    • 2011-11-23
    • 2016-09-18
    • 1970-01-01
    • 2011-10-30
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多