2016-03-31 10 views
0

Ich versuche, diese SQL-Abfrage in NHibernate zu replizieren:Erhalten Sie alias für SelectSum

SELECT player.NAME, 
     Sum(achievement.value) AS 'Goals Scored' 
FROM player 
     JOIN playerperformance 
     ON playerperformance.player_id = player.id 
     JOIN achievement 
     ON achievement.playerperformance_id = playerperformance.id 
WHERE achievement.descriptor = 'Goals Scored' 
GROUP BY player.NAME, 
      player.id 
ORDER BY 'Goals Scored' DESC 

Hier ist meine NHibernate LINQ-Abfrage:

_dataAccessor.QueryOver<Player>() 
    .Inner.JoinQueryOver<PlayerPerformance>(player => player.Performances) 
    .Inner.JoinQueryOver<Achievement>(perf => perf.Achievements,() => achievementAlias) 
    .Where(a => a.Descriptor == "Goals Scored") 
    .SelectList(list => list.SelectGroup(player => player.Id).SelectSum(() => achievementAlias.Value)) 
    .OrderBy(a => a.Value).Desc 
    .List() 
    ; 

Dieses fast richtig ist. Aber der OrderBy geht falsch. Ich weiß nicht, was ich in das OrderBy-Lambda schreiben soll, das es auf dem Alias ​​für den SelectSum(...)-Teil ordnen würde. Es ist ein Alias ​​in der generierten SQL:

SELECT this_.id    AS y0_, 
     Sum(achievemen2_.value) AS y1_ 
FROM [player] this_ 
     INNER JOIN [playerperformance] playerperf1_ 
       ON this_.id = playerperf1_.player_id 
     INNER JOIN [achievement] achievemen2_ 
       ON playerperf1_.id = achievemen2_.playerperformance_id 
WHERE achievemen2_.descriptor = @p0 
GROUP BY this_.id 
ORDER BY achievemen2_.value DESC 

Also alles, was ich tun muß, ist NHibernate zu überzeugen ORDER BY y1_ statt ORDER BY achievemen2_.Value zu tun. Aber ich kann nicht herausfinden, wie man den Alias ​​für die Summe bekommt.

Irgendwelche Ideen?

Antwort

0

Ich fand es heraus. SelectSum(...) hat eine WithAlias Methode, also könnte ich auf einen ganzzahligen Alias ​​zeigen, der die Summe darstellt. Dann musste ich nur OrderByAlias(...) anstelle von OrderBy(...) verwenden:

int sumAlias = 0; 

_dataAccessor.QueryOver<Player>() 
    .Inner.JoinQueryOver<PlayerPerformance>(player => player.Performances) 
    .Inner.JoinQueryOver<Achievement>(perf => perf.Achievements,() => achievementAlias) 
    .Where(a => a.Descriptor == "Goals Scored") 
    .SelectList(list => list.SelectGroup(player => player.Id).SelectSum(() => achievementAlias.Value).WithAlias(() => sumAlias) 
    .OrderByAlias(() => sumAlias).Desc 
    .List<object[]>() 
    ; 
Verwandte Themen