2010-12-24 63 views
0

我有如下記錄:獲得最高分的排名與最早時間戳

name score Date 
    Billy 32470 12/18/2010 7:26:35 PM 
    Sally 1100 12/19/2010 12:00:00 AM 
    Kitty 1111 12/21/2010 12:00:00 AM 
    Sally 330 12/21/2010 8:23:34 PM 
    Daisy 32460 12/22/2010 3:10:09 PM 
    Sally 32460 12/23/2010 4:51:11 PM 
    Kitty 32440 12/24/2010 12:00:27 PM 
    Billy 32460 12/24/2010 12:11:36 PM 

我想使用LINQ最早時間標記的最高得分的排行榜。 在這種情況下,正確的是

rank name 
    1 Billy 
    2 Daisy 
    3 Sally 

我用下面的查詢:

var result = 
(from s in Submissions 
group s by s.name into g 
orderby g.Max(q => q.Score) descending,g.Min(q => q.Date) ascending 
select new ScoreRecord 
{ 
name = g.Key 
Score = g.Max(q => q.Score) 
}).Take(3).ToList(); 

我收到以下錯誤的結果:

rank name 
    1 Billy 
    2 Sally 
    3 Daisy 

什麼是正確的LINQ查詢在此案件?

回答

1

目前,您可以獲取最高分和某個人的最短日期,但不一定是同一條記錄。

你需要限制最短日期,只查看那些具有所需最高分數的記錄......這不是最乾淨的方式,但會起作用(我不擅長Linq語法,很多喜歡拉姆達)

var result = 
(from s in Submissions 
group s by s.name into g 
orderby g.Max(q => q.Score) descending, 
    g.Where(i => i.Score == g.Max(q => q.Score)).Min(q => q.Date) ascending 
select new ScoreRecord 
{ 
name = g.Key 
Score = g.Max(q => q.Score) 
}).Take(3).ToList(); 
+0

整理一下,你可以使用'let'語句把最大比分變成了變量和重用。 – 2010-12-24 05:53:41

-1

嘗試一些簡單的也許

var max = Submissions.Max(m => m.score); 
var result = Submissions.Where(s => s.score == max).OrderBy(s => s.Date);