NHibernate聚合子查询

Car*_*arl 2 .net c# sql-server nhibernate

我有NHibernate的问题,我似乎无法找到一个简单的方法.

我有以下数据库:

游戏:ID,分数,Match_ID

匹配:ID

一场比赛包括3场比赛.

我想找出最大匹配分数是什么,所以下面的SQL可以解决这个问题:

select max(a.total) from 
  (select Match.ID, sum(Game.Score) as total 
     from Game inner join Match
     on Game.Match_ID = Match.ID
     group by Match.ID) a
Run Code Online (Sandbox Code Playgroud)

在NHibernate中,这看起来有点棘手.显然,HQL不允许from子句中的子查询,所以我不能真正使用它.

我很确定它可以用ICriteria完成,但我刚刚开始使用NH,所以我似乎无法弄明白.我基本上得到了以下内容:

Session.CreateCriteria<Game>()
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.GroupProperty("Match"))
        .Add(Projections.Sum("Score"))).List();
Run Code Online (Sandbox Code Playgroud)

在那之后,我玩了各种各样的DetachedCriteria,但似乎只是围成一圈.

Ahm*_*ruz 6

对于HQL世界,单个查询可以解决问题......

var maxScore = session.CreateQuery(@"select sum(game.Score) 
                                     from Game game 
                                     group by game.Match
                                     order by sum(game.Score) desc")
                      .SetMaxResults(1)
                      .UniqueResult<long>();
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助..

更新:对于Criteria世界,可能有更好的结果转换,但这只是工作:)

var max = (int)session.CreateCriteria<Game>("game")
    .SetProjection(Projections.ProjectionList()
                       .Add(Projections.GroupProperty("game.Match"))
                       .Add(Projections.Sum("game.Score"), "total"))
    .AddOrder(Order.Desc("total"))
    .SetMaxResults(1)
    .SetResultTransformer(Transformers.AliasToEntityMap)
    .UniqueResult<IDictionary>()["total"];
Run Code Online (Sandbox Code Playgroud)