Top Highscore LINQ to SQL
本文关键字:SQL to LINQ Highscore Top | 更新日期: 2023-09-27 18:18:00
我有一个名为" hilicore "的在线高分表。该表包含以下列:
Id, int (auto value)名称,字符串(玩家名)Guid,字符串(玩家id)分数,int(分数)硬币,int(玩家的硬币)创建,日期时间(创建日期)
我需要的是前50分,但按Guid分组。我发现了一个LINQ表达式几乎可以工作。我如何在LINQ查询中获得GROUP BY的最大行?
最后我需要一个HighScore对象的列表。使用上面的表达式,我得到了一个匿名列表。
编辑:实际上我的表的名称是"CatGameScore",但我改变了它在这篇文章。
表的内容(仅说明了指南和日期)
Id Name Guid Score Coins Created
1 Hugo 123-123 150 10 <date>
2 Peter 456-456 600 19 <date>
3 Hugo 123-123 550 26 <date>
我的输出应该是这样的:
Id Name Guid Score Coins Created
2 Peter 456-456 600 19 <date>
3 Hugo 123-123 550 26 <date>
输出必须是List。我能够获得每个人的前50个分数,但我不能创建我的分数对象列表。
谢谢你的提示。
安迪除此之外:我如何在LINQ查询中获得GROUP BY的最大行?
你需要使用Take and Skip方法来帮助你完成任务。
比如
MyScoreCollection.OrderByDescending(x => x.Score).Take(50) .GroupBy(x => x.Guid);
像这样?
context.HighScoreSet.OrderByDescending(x => x.Score)
.Take(50)
.GroupBy(x => x.Guid);
像这样的东西可以达到目的
//assuming you have a List<HighScore>
var scores = new List<HighScore>();
EDIT:从数据库中获取所有分数(命中db一次)。然后,您可以使用Tuple对象,而无需将其转换为SQL
scores = (from s in context.ScoreSet //or something like this
select s).ToList();
结束编辑
//get list of Tuples containing player Id and max score
var topScores = from s in scores
group s.Score by s.Guid into grouping
orderby grouping.Max() descending
select new Tuple<string, int>(grouping.Key, grouping.Max()).Take(50);
//get matching HighScore records from List<HighScore>
var scoreRecords = from score in scores
let tuple = new Tuple<string, int>(score.Guid, score.Score)
where topScores.Contains(tuple)
select score;
这是我的答案,我把HighScore
表称为Scores
,因为这对我来说似乎更正确。
var highScorePerPlayer =
scores.GroupBy(
s => s.Guid,
s => s.Score,
(playerID, scores) =>
new KeyValuePair<string,int> (playerID, scores.Max()));
var top50HighScores = highScorePerPlayer.OrderByDescending(hs => hs.Value)
.Take(50);
从问题来看,我认为你希望每个玩家都有一个不同的高分,所以每个玩家只会在列表中出现一次。如果不是这种情况,您应该反转操作,就像其他答案一样。结果将是IEnumerable<KeyValuePair<string, int>