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

関連する問題