我需要在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中做到这一点?或Criteria 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();
我也尝试过一个小组,但无论我做什么,如果我在超过一个聚合中引用TableC,NH3总会引发异常。如果我只使用一个聚合,则执行查询。如果我尝试用两个聚合来做,我得到一个例外。
答案 0 :(得分: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将始终有效。