2016-04-02 12 views
0

私はクラスの学生が試験のコレクションを持っていますが、各試験にはタイトルと日付があります。 私のビューモデルでは、各生徒の試験ごとにグリッドを表示したいのですが、最新の試験日付の列を追加したいのですが(これはそれぞれの行について繰り返されますが、これはどのように要求されたかわかります)Linq追加列(最大日付)

私は結果がこの

  • 名前のようにする必要があり

    var list = (from s in uow.Students.GetAll() 
          join e in uow.Exams.GetAll() on s.Id equals e.StudentId 
          select new ExamViewModel 
          { 
           StudentName = s.Name, 
           ExamTitle = e.Title, 
           ExamDate = e.ExamDate, 
           LastExam =??? 
          }); 
    

    最大最後の試験日を入れたい各行で

    public class Student 
    { 
        public int Id { get; set; } 
        public int Name { get; set; } 
        public IEnumerable<Exam> Exams { get; set; } 
    } 
    
    public class Exam 
    { 
        public int StudentId { get; set; } 
        public int Id { get; set; } 
        public string Title { get; set; } 
        public DateTime ExamDate { get; set; } 
    } 
    
    public class ExamViewModel 
    { 
        public string StudentName { get; set; } 
        public string ExamTitle { get; set; } 
        public DateTime ExamDate { get; set; } 
        public Exam LastExam { get; set; } 
    } 
    

    ------------- ---- ExamTitle ------日付------------- ---- LatestExamDate

  • マイクピーター---------フランス語------- 15/03/2015 --------- 20/12/2015
  • マイクPeter ---------数学---------- 16/03/2015 --------- 20/12/2015
  • Mike Peter ----- ---- UML ---------- 20/12/2015 -------- 20/12/2015
  • David Ula ---------- C# - - ----------- 12/12/2015 -------- 14/12/2015
  • David Ula ---------- VB ----- ------- 16/09/2015 --------- 14/12/2015
  • David Ula ----------バイオ-------- - 2014年12月14日--------- 14/12/2015
  • デビッドULA ---------- Mngmt --------- 2015年10月10日--------- 14/12/2015
+0

ですが 'そのユーザーの最新の試験日、または最新の試験日のためにLatestExamDate'すべての試験? – Rob

+0

LatestExamDateはユーザーのため – Maro

+0

あなたのプロパティ 'Exams'は外国関係として正しく結びついています(私はこれがSQLに変換されていると仮定しています) – Rob

答えて

1

このクエリをもっと簡単にするために、双方向ナビゲーションを適切に構成することができます。

Exam

public virtual Student Student { get; set; } 

に次のプロパティを追加して、既存のStudentIDで動作するように構成します。

あなたのクエリは、次のようになります。

uow.Exams().GetAll().Select(e => new { 
    StudentName = e.Student.Name, 
    ExamTitle = e.Title, 
    ExamDate = e.ExamDate, 
    LastExamDate = e.Student.Exams.Max(e => e.ExamDate) 
}) 

を別の方法として、あなたがこれを行う必要があると思います:

var list = (from s in uow.Students.GetAll() 
     join e in uow.Exams.GetAll() on s.Id equals e.StudentId 
     select new ExamViewModel 
     { 
      StudentName = s.Name, 
      ExamTitle = e.Title, 
      ExamDate = e.ExamDate, 
      LastExamDate = uow.Exams.GetAll().Where(e => e.StudentId == s.Id).Max(e => e.ExamDate) 
     }); 
+0

私の質問に答える時間をとってくれてありがとう+1! ** LastExamDate **がdateTimeではないExamタイプの場合はどうなりますか?私は私の質問を変更します – Maro

+0

@マロNo worries !. 'uow.Exams.GetAll()。Where(e => e.StudentId == s.Id).OrderByDescending(e => e.ExamDate).FirstOrDefault() '(そうではありません。テストされていますが、アイデアはうまくいくはずです) 'Max'チェンジの代わりに' OrderByDescending/FirstOrDefault'が両方の例で動作するはずです – Rob

+0

Thx私はそれを試みます。 – Maro

0
var list = (from s in uow.Students.GetAll() 
      join e in uow.Exams.GetAll() on s.Id equals e.StudentId 
      select new ExamViewModel 
      { 
       StudentName = s.Name, 
       ExamTitle = e.Title, 
       ExamDate = e.ExamDate, 
       LastExamDate = uow.Exams.GetAll().OrderByDescending(x=> x.ExamDate).First(x=> x.StudentId = s.Id) 
      }); 
+1

' e'コレクションではない、それは行です。 – Rob

+0

私はちょうどそれを訂正させました –

+0

これを見て –