2010-10-27 84 views
1

我需要执行类似于T-SQL这样的分组聚集:您可以使用NH3执行复杂的聚合操作吗?

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(); 

我也有一组尝试过通过但无论我做什么,NH3如果我是指表C中总是抛出一个异常超过一个聚合。如果我只有一个聚合,它会执行查询。如果我试图用两个聚合体来做,我会得到一个异常。

回答

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

相关问题