从GroupBy键中选择一个对象

时间:2019-08-13 15:53:53

标签: nhibernate linq-to-nhibernate

我已经习惯了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

2 个答案:

答案 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,您可以找到错误的原因。