2009-11-04 83 views
2

我有一个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 

在NHibernate的,这似乎是有点棘手。显然,HQL不允许子条目中的子查询,所以我不能真正使用它。

我很确定它可以用ICriteria完成,但我只是刚开始使用NH,所以我似乎无法弄清楚。我基本上有以下几点:

Session.CreateCriteria<Game>() 
    .SetProjection(Projections.ProjectionList() 
     .Add(Projections.GroupProperty("Match")) 
     .Add(Projections.Sum("Score"))).List(); 

之后,我已经用的DetachedCriteria的各种花色品种玩耍了,只是似乎在圈子一轮去。

回答

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>(); 

希望这有助于。

更新:对于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"]; 
+0

谢谢,HQL的工作原理。 – Carl 2009-11-05 19:40:13

1

我真的做这样的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 

组由始终处于标准棘手/ HQL:因为GROUP BY子句只能返回任何其他列的分组列和聚集。因此,不可能从group by子句中返回整个实体,而只能返回您正在分组和聚合的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(); 
+0

我甚至没有想过改变这样的查询,谢谢!我实际上是'那些'之一,因为之前将大部分事物作为存储过程来完成,因此将SQL放入我的代码中可能不会发生。起初HQL让我感到害怕,但我认为它非常强大,所以我会沿着这条路线走下去。 – Carl 2009-11-05 19:39:01

+0

是啊!除了其他人捏我的SQL,并把它变成HQL! – reach4thelasers 2009-11-06 18:03:23