2016-11-21 43 views
0

我有一份調查答卷表(評估),一個地區可以提交多個評估報告,但我只希望針對每個地區的最新評估做出迴應。由幾個字段組合並選擇最近日期?

下面是我的數據,標有*的記錄將是那些我想回報

AsessmentID AssessmentDate Status AreaID Response Category 
      1 01/01/2016 Complete 1  1 A 
      1 01/01/2016 Complete 1  2 B 
      1 01/01/2016 Complete 1  4 C 
      2 05/01/2016 Complete 1  5* A 
      2 05/01/2016 Complete 1  4* B 
      2 05/01/2016 Complete 1  5* C 
      3 02/01/2016 Complete 2  1* A 
      3 02/01/2016 Complete 2  2* B 
      3 02/01/2016 Complete 2  4* C 
      4 03/01/2016 Complete 3  5* A 
      4 03/01/2016 Complete 3  4* B 
      4 03/01/2016 Complete 3  5* C 
      5 04/01/2016 Draft  3  3 A 
      5 04/01/2016 Draft  3  2 B 
      5 04/01/2016 Draft  3  3 C 

這是到目前爲止我的LINQ,但它只返回2個響應

from c in db.Answers.Where(b => b.Status == Status.Complete) 
            group c by new { c.AreaID, c.AssessmentID, c.AssessmentDate} into grp 
            select grp.OrderByDescending(c => c.AssessmentDate).FirstOrDefault(); 

回答

0

你可以像這樣做:

var results = db.Answers 
    .Where(x => x.Status == Status.Complete) 
    .GroupBy(x => x.AreaID)  //group by AreaID 
    .Select(x => new   //project onto anonymous type with the data we need 
    { 
     //the AreaID 
     AreaID = x.Key,   

     //get a collection for the responses we need 
     Responses = x   
      //Group by the date of the assessment 
      .GroupBy(r => r.AssessmentDate) 

      //order descending so we get the last responses 
      .OrderByDescending(r => r.Key) 

      //take only the first in the list (latest) 
      .Take(1) 

      //project the ordered result extracting the properties we want to show 
      .SelectMany(r => r.Select(ri => new { ri.AssessmentDate, ri.Response})) 
    }) 
    //enumerate 
    .ToList(); 

使用此代碼打印到控制檯:

foreach (var g in results) 
{ 
    Console.WriteLine("AreaID: {0}", g.AreaID); 
    Console.WriteLine("Date  Response"); 
    foreach (var r in g.Responses) 
     Console.WriteLine("{0} {1}", r.AssessmentDate.ToShortDateString().PadRight(10,' '), r.Response); 

    Console.WriteLine(); 
} 

你應該得到這樣的:

AreaID: 1 
Date  Response 
5/1/2016 5 
5/1/2016 4 
5/1/2016 5 

AreaID: 2 
Date  Response 
2/1/2016 1 
2/1/2016 2 
2/1/2016 4 

AreaID: 3 
Date  Response 
3/1/2016 5 
3/1/2016 4 
3/1/2016 5 

希望這有助於!

+0

輝煌,唯一的麻煩是,我沒有提到每個響應也有一個屬性稱爲「類別」,我需要每個區域的平均類別值 – totalitarian

+0

我認爲您需要定義如何計算平均值A,B,C ..值。那麼找出你想要的東西應該不那麼難。 :) –

+0

計數(類別)/總和(類別) – totalitarian