在linq2nhibernate中使用'group by'后遇到很多问题,我试图切换到HQL,但我只想用一个简单的例子。
我有下表(ForumThreadRatings):
我想检索一个评价最高的论坛帖子的列表,这意味着我需要通过forumthread与积极列和组进行总结。我试过一个例子,只是在HQL中做一个简单的小组而没有运气:
select ftr.ForumThread from ForumThreadRating ftr group by ftr.ForumThread
但是我收到以下错误:
Column 'ForumThreads.Id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
我可能会遗失什么?
答案 0 :(得分:2)
来自the docs:
NHibernate目前不扩展分组实体,因此如果cat的所有属性都是非聚合的,则无法编写
group by cat
。您必须明确列出所有非聚合属性。
在任何情况下,确切的查询都可以通过以下方式完成:
select distinct ftr.ForumThread from ForumThreadRating ftr
但当然您可能需要sum
或count
某些内容,因此您需要明确地汇总属性。
更新:这里是如何获得前10个主题:
var topThreads = session.CreateQuery(@"
select (select sum(case
when rating.Positive = true then 1
else -1
end)
from ForumThreadRating rating
where rating.ForumThread = thread),
thread
from ForumThread thread
order by 1 desc
")
.SetMaxResults(10)
.List<object[]>()
如您所见,此查询返回object[]
列表,每个列表包含两个元素:[0]
是评级,[1]
是ForumThread。
您可以使用以下方式获取ForumThreads:
.Select(x => (ForumThread)x[1]);
或者将它们投射到DTO等等。