2010-10-27 80 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將始終工作。

相關問題