我已经习惯了GroupBy()不仅是一门艺术,而不仅仅是一门科学,但也许有人可以帮助我解决一个非常具体的问题:
给出以下代码
var results = session.Query<MyClass>()
.GroupBy(c => c.OtherPersistentObject)
.Select(group => new
{
key = group.Key,
count = group.Count()
})
.ToList();
生成的查询如下所示:
/* [expression] */select
otherclass_.ID as col_0_0_,
cast(count(*) as INT) as col_1_0_,
otherclass_.ID as id1_1_,
otherclass_.START_DATE as start2_1_,
otherclass_.END_DATE as end3_1_,
otherclass_.Zone as zone9_1_
from
mytable mytable0_
left outer join
otherclass otherclass_
on mytable0_.otherID=otherclass_.ID
group by
mytable0_.otherID
这给了我SQL错误“ Column 'otherclass .ID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause
”
有没有办法让Select做到我想要的?
TIA
答案 0 :(得分:1)
这是一个已知的NHibernate问题NH-3027。
作为解决方法,您可以使用此answer中描述的最后一种方法(将GroupBy部分重写为子查询)。因此,您的查询可以重写为:
var results = session.Query<MyClass>()
.Where(c => c == session.Query<MyClass>().First(cs => cs.OtherPersistentObject == c.OtherPersistentObject))
.Select(x => new
{
key = x.OtherPersistentObject,
count = session.Query<MyClass>().Count(cs => cs.OtherPersistentObject == x.OtherPersistentObject)
}).ToList();
答案 1 :(得分:0)
尝试一下:
var results = session
.Query<MyClass>()
.GroupBy(c => c.OtherPersistentObject)
.Select(group => new
{
key = group.Key.Id,
count = group.Count()
})
.ToList();
Here,您可以找到错误的原因。