我有一张名为“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名的分数,但我无法创建我的分数对象列表。
感谢任何提示。
安迪
答案 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?
类似
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>