Nhibernate group by - 为每个外键选择最新行

时间:2014-07-06 23:13:03

标签: c# nhibernate orm group-by queryover

我在NHibernate和简单的GROUP BY表达方面遇到了困难。

我有一张包含用户活动记录的表格。我需要为每个用户返回最新的活动行,按时间降序排序,这也与降序ID(自动增量)相对应。

基本上,这是我想要运行的SQL:

SELECT * FROM log_user_activity GROUP BY UserID DESC

我搜索了一个类似的问题并得到了一堆关于投影,子查询,DTO的答案......

有没有简单的方法可以做到这一点,没有定义新的DTO类,或者使用带有匿名对象的投影,我必须再次手动指定所有列?使用QueryOver语法的解决方案更可取,但不是强制性的。

1 个答案:

答案 0 :(得分:1)

  

有没有简单的方法可以做到这一点,没有定义新的DTO类,或者使用带有匿名对象的投影,我必须再次手动指定所有列?

不,没有其他办法,那么:

  1. 按原样选择映射对象
  2. 选择投影 - ,可以但不必将其转换为原始对象或DTO对象(我们始终可以返回.List<object[]>() ...) < / LI>

    但我们可以做的是从16.8. Subqueries中获利,并返回一个映射对象列表为它们,并使用max Time属性进行过滤:

    ActivityLog activity = null;
    
    // subquery to be later used for EXISTS
    var maxSubquery = QueryOver.Of<ActivityLog>()
        .SelectList(l => l
            .SelectGroup(item => item.UserID)
            .SelectMax(item => item.Time)
        )
        // WHERE Clause
        .Where(x => x.UserID == activity.UserID )
        // HAVING Clause
        .Where(Restrictions.EqProperty(
            Projections.Max<ActivityLog>(item => item.Time),
            Projections.Property(() => activity.Time)
        ));
    
    // final query without any transformations/projections... but filtered
    var result = session.QueryOver<ActivityLog>(() => activity)
        .WithSubquery
        .WhereExists(maxSubquery)
        .List<ActivityLog>()
        ;
    

    同时检查以下内容: