Можете ли вы выполнять сложные агрегатные операции с использованием NH3? - PullRequest
1 голос
/ 27 октября 2010

Мне нужно выполнить группирование, похожее на что-то подобное в 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();

Я также пробовал это с группой, но независимо от того, что я делаю, NH3 всегда выдает исключение, если я ссылаюсь на TableC в более чем одном агрегате. Если у меня есть только один агрегат, запрос выполняется. Если я попытаюсь сделать это с двумя агрегатами, я получу исключение.

1 Ответ

1 голос
/ 28 октября 2010

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

...