Top High RSSore LINQ to SQL

时间:2011-12-15 07:18:22

标签: c# sql linq

我有一张名为“HighScore”的在线高分榜。该表包含以下列:

Id,int(自动值) 姓名,字符串(玩家姓名) Guid,string(玩家ID) 分数,int(分数) 硬币,int(玩家的硬币) 已创建,日期时间(创建日期)

我需要的是排名前50的分数,但是由Guid分组。我找到了几乎可以工作的LINQ表达式。 How do I get the MAX row with a GROUP BY in LINQ query?

最后我需要一个HighScore对象列表。通过上面的表达式,我得到了一个匿名的列表。

修改 实际上我的表名是“CatGameScore”,但我在这篇文章中对其进行了更改。

表的内容(guid和日期只是图示)

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名的分数,但我无法创建我的分数对象列表。

感谢任何提示。

安迪

4 个答案:

答案 0 :(得分:1)

这样的东西?

context.HighScoreSet.OrderByDescending(x => x.Score)
                    .Take(50)
                    .GroupBy(x => x.Guid);

答案 1 :(得分:1)

除此之外:How do I get the MAX row with a GROUP BY in LINQ query?

您需要使用TakeSkip方法来帮助您完成任务。

类似

MyScoreCollection.OrderByDescending(x => x.Score).Take(50) .GroupBy(x => x.Guid); 

答案 2 :(得分:1)

这样的事情可以解决这个问题

//assuming you have a List<HighScore>
var scores = new List<HighScore>();

编辑:从数据库中获取所有分数(点击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;

答案 3 :(得分:0)

以下是我的回答,我称之为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>