2010-10-27 1 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? или 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 всегда вызывает исключение, если я имею в виду TableC в более один агрегат. Если у меня есть только один агрегат, запрос выполняется. Если я попытаюсь сделать это с двумя агрегатами, я получаю исключение.

ответ

1

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 всегда будет работать.