【问题标题】:Nhibernate group by - select latest row for each foreign keyNhibernate group by - 为每个外键选择最新行
【发布时间】:2014-08-27 09:08:33
【问题描述】:

我在使用 NHibernate 和简单的 GROUP BY 表达式时遇到了困难。

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

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

SELECT * FROM log_user_activity GROUP BY UserID DESC

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

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

【问题讨论】:

    标签: c# nhibernate orm group-by queryover


    【解决方案1】:

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

    不行,没有别的办法,那么:

    1. 按原样选择映射对象
    2. 选择一个投影 - 可以但不必转换为原始或 DTO 对象(我们总是可以返回 .List<object[]>()...)

    但我们可以做的是从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>()
        ;
    

    还要检查这些:

    【讨论】:

      猜你喜欢
      • 2020-11-19
      • 2022-08-11
      • 2015-01-14
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 2016-05-15
      • 2016-03-11
      相关资源
      最近更新 更多