2016-11-21 44 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