C# NHibernate聚合子查询
我对NHibernate有一个问题,我似乎找不到一个简单的解决办法 我有以下数据库: 游戏:ID,分数,比赛ID 匹配:ID 一场比赛由三场比赛组成 我想知道最大匹配分数是多少,因此下面的SQL可以实现这一点: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
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"];