我在NHibernate和简单的GROUP BY表达方面遇到了困难。
我有一张包含用户活动记录的表格。我需要为每个用户返回最新的活动行,按时间降序排序,这也与降序ID(自动增量)相对应。
基本上,这是我想要运行的SQL:
SELECT * FROM log_user_activity GROUP BY UserID DESC
我搜索了一个类似的问题并得到了一堆关于投影,子查询,DTO的答案......
有没有简单的方法可以做到这一点,没有定义新的DTO类,或者使用带有匿名对象的投影,我必须再次手动指定所有列?使用QueryOver语法的解决方案更可取,但不是强制性的。
答案 0 :(得分:1)
有没有简单的方法可以做到这一点,没有定义新的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>()
;
同时检查以下内容: