【问题标题】:Can you perform complex aggregate operations using NH3?您可以使用 NH3 执行复杂的聚合操作吗?
【发布时间】:2026-02-24 00:15:02
【问题描述】:

我需要在 T-SQL 中执行类似于这样的分组聚合:

select b.Name as [Grouped Name],
COUNT(distinct a.ID) as [Grouped Count], 
COUNT(distinct c1.ID) as [Second Group Count], 
COUNT(distinct c2.ID) as [Third Group Count]
from TableA a
left join TableB b on a.ID = b.TableAID
left join TableC c1 on a.ID = c1.TableAID and c1.SomeCondition = 1
left join TableC c2 on a.ID = c2.TableAID and c2.SomeCondition = 2
group by b.Name
order by b.Name

我曾多次尝试构建对象模型,然后使用 NH3 对其进行映射,然后构建将构建此 SQL 语法的查询,但收效甚微。

使用 NH3 可以做到这一点吗?如果是这样,有没有办法在 LINQ 中做到这一点?还是标准 API?还是 HQL?

在这一点上,我对任何事情都持开放态度。我只需要指出正确的方向,因为到目前为止我所经历的所有兔子洞都没有把我带到任何地方。

到目前为止我尝试过的 LINQ 是这样的:

//act
var query = from a in session.Query<TableA>()
    orderby a.TableB.Name
    select
        new
        {
            Grouped Name = a.TableB.Name,
            GroupedCount = a.Count(),
            SecondGroupCount = a.TableC.Count(c => c.SomeCondition == 1),
            ThirdGroupCount = a.TableC.Count(c => c.SomeCondition == 2),
        };

var results1 = query.ToList();

我也尝试过使用 group by,但无论我做什么,如果我在多个 一个 聚合中引用 TableC,NH3 总是会引发异常。如果我只有一个聚合,则执行查询。如果我尝试使用两个聚合来执行此操作,则会出现异常。

【问题讨论】:

    标签: nhibernate hql linq-to-nhibernate nhibernate-criteria


    【解决方案1】:

    HQL 可能是要走的路。 Linq 太漏,Criteria 太冗长。

    类似的东西:

    select b.Name as [Grouped Name],
    COUNT(distinct a.id) as [Grouped Count], 
    COUNT(distinct c1.id) as [Second Group Count], 
    COUNT(distinct c2.id) as [Third Group Count]
    from TableA a
    left join a.TableB b
    left join a.TableC c1 with c1.SomeCondition = 1
    left join a.TableC c2 with c2.SomeCondition = 2
    group by b.Name
    order by b.Name
    

    这与您的 SQL 几乎相同,只是对连接进行了细微调整。 我不完全确定 TableC 的双重连接是否有效,但尝试一下也无妨。

    无论如何,如果 SQL 有效,您不必停止使用它... CreateSQLQuery 将始终有效。

    【讨论】: