2013-02-06 49 views
1

我有一個列表,它是像下面LINQ的選擇得分最高的組

Name Score Date 
S1 2  15/02/2013 
S1 4  15/02/2013 
S2 0  15/02/2013 
My desired out should be 
S1 6  15/02/2013 

爲了這個,我寫了LINQ代碼

(from _data in _rawData 
    group _data by new { _data.Date, _data.Name } into gp orderby gp.Key.Date    
      select new 
      {     
       score = gp.Sum(_score => _score.Score), 
       store = gp.Max(_store => _store.Name), 
       Date = gp.Max(_Date => _Date.Date) 
      }).OrderByDescending(_score => _score.score) 
      .ToList(). 
      ForEach(item => _timeLiner.Add(new TimeLiner() 
      { 
       id = _id++.ToString(), 
       start = item.auditDate.ToString(), 
       title = "TopStore: " + item.store 
      } 

.Take(1).ToList()試過,Single()SingleOrDefault()的前1名,First()但我沒有得到所需的輸出。相反,我得到的

S1 6  15/02/2013 
S2 0  15/02/2013 

回答

1

top是一系列新的變量,其中包含一天的最高得分名稱的摘要數據

from d in _rawData 
group d by d.Date into dateGroup 
let top = dateGroup.GroupBy(x => x.Name) 
        .Select(g => new { Name = g.Key, Score = g.Sum(x => x.Score)}) 
        .OrderByDescending(x => x.Score) 
        .First() 
select new 
{     
    Name = top.Name, 
    Score = top.Score, 
    Date = dateGroup.Key 
} 
+1

感謝您的幫助。根據我的要求,這是準確的。 – Hussain

0

下應該給你所需要的輸出:

(from _data in _rawData 
group _data by new { _data.Date, _data.Name } into gp orderby gp.Key.Date 
select new 
{     
    score = gp.Sum(_score => _score.Score), 
    store = gp.Max(_store => _store.Name), 
    Date = gp.Max(_Date => _Date.Date) 
}).OrderByDescending(_score => _score.score) 
    .First(); 

或者有點更具可讀性:

_rawData.GroupBy(x => new { x.Date, x.Name }) 
     .Select(g => new { 
          Score = g.Sum(x => x.Score), 
          Store = g.Key.Name, 
          Date = g.Key.Date 
         } 
     .OrderByDescending(x => x.Score) 
     .First()