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个分数,但我不能创建我的分数对象列表。

谢谢你的提示。

安迪

Top Highscore LINQ to SQL

除此之外:我如何在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>