Nhibernate 您可以使用NH3执行复杂的聚合操作吗?

Nhibernate 您可以使用NH3执行复杂的聚合操作吗?,nhibernate,hql,linq-to-nhibernate,nhibernate-criteria,Nhibernate,Hql,Linq To Nhibernate,Nhibernate Criteria,我需要执行与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 jo

我需要执行与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();
//act
var query=来自会话中的会话。query()
orderby a.TableB.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();

我也曾在一个小组中尝试过,但无论我做什么,如果我在多个集合中引用TableC,NH3总是抛出一个异常。如果只有一个聚合,则执行查询。如果我尝试使用两个聚合,我会得到一个例外。

HQL可能是一种方法。Linq太泄漏,标准太冗长

大致如下:

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将始终有效。

HQL可能是一条可行之路。Linq太泄漏,标准太冗长

大致如下:

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将始终工作