C# NHibernate聚合子查询

C# NHibernate聚合子查询,c#,.net,sql-server,nhibernate,C#,.net,Sql Server,Nhibernate,我对NHibernate有一个问题,我似乎找不到一个简单的解决办法 我有以下数据库: 游戏:ID,分数,比赛ID 匹配:ID 一场比赛由三场比赛组成 我想知道最大匹配分数是多少,因此下面的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 gr

我对NHibernate有一个问题,我似乎找不到一个简单的解决办法

我有以下数据库:

游戏:ID,分数,比赛ID

匹配:ID

一场比赛由三场比赛组成

我想知道最大匹配分数是多少,因此下面的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
在NHibernate中,这似乎有点棘手。显然,HQL不允许在from子句中使用子查询,所以我不能真正使用它

我很确定这可以用ICriteria来完成,但我才刚刚开始使用NH,所以我似乎无法理解。我基本上有以下几点:

Session.CreateCriteria<Game>()
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.GroupProperty("Match"))
        .Add(Projections.Sum("Score"))).List();
Session.CreateCriteria()
.SetProjection(Projections.ProjectionList()项目)
.Add(Projections.GroupProperty(“匹配”))
.Add(projects.Sum(“Score”)).List();

在此之后,我使用了各种各样的DetachedCriteria,但似乎只是在兜圈子。

我实际上会用SQL这样做:

select top 1 Match.ID, sum(Game.Score) as total 
     from Game inner join Match
     on Game.Match_ID = Match.ID
     group by Match.ID order by total desc
GROUPBY在Criteria/HQL中总是很棘手:因为GROUPBY子句只能返回分组列和任何其他列的聚合。因此,不可能从GROUPBY子句返回整个实体,只返回分组依据的ID和聚合

因此,我通常使用本机SQL按查询分组,如下所示:

ISQLQuery sqlQuery1 = NHibernateSessionManager.Instance.GetSession().CreateSQLQuery("select Match.ID, sum(Game.Score) as total from Game inner join Match on Game.Match_ID = Match.ID group by match.ID order by total desc");
sqlQuery1.AddScalar("id", NHibernateUtil.Int32); //
sqlQuery1.AddScalar("total", NHibernateUtil.Int32);
sqlQuery1.SetMaxResults(1);    
var result = sqlQuery1.List();

对于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>();
var maxScore=session.CreateQuery(@“选择总和(game.Score))
从游戏
分组比赛
按总和排序(游戏分数)desc“
.SetMaxResults(1)
.UniqueResult();
希望这有帮助

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

var max=(int)session.CreateCriteria(“游戏”)
.SetProjection(Projections.ProjectionList()项目)
.Add(Projections.GroupProperty(“game.Match”))
.Add(projects.Sum(“game.Score”),“total”))
.AddOrder(订单描述(“总计”))
.SetMaxResults(1)
.SetResultTransformer(Transformers.AliasToEntityMap)
.UniqueResult()[“总计];

我甚至没有想过要这样更改查询,谢谢!事实上,我是“其中一个”以前会将大部分事情作为存储过程来完成的人,所以在我的代码中加入SQL可能不会发生。HQL一开始吓了我一跳,但我觉得它很强大,所以我想我会沿着这条路走。是的!除了另一个家伙把我的SQL压缩成HQL!
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"];