2016-04-02 12 views
0

Ich habe Klasse Student mit Sammlungen von Prüfungen, jede Prüfung hat Titel und Datum. In meiner Ansicht Modell möchte ich ein Raster mit jeder Prüfung jedes Schülers anzeigen, aber ich würde gerne zusätzliche Spalte mit neuesten Prüfung Datum hinzufügen (ich weiß, dass dies für jede Zeile wiederholt wird, aber das ist, wie es angefordert wurde.Linq hinzufügen zusätzliche Spalte (max Datum)

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; } 
} 

In jeder Zeile Ich mag würde dem Max letzten Prüfungstermin

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 =??? 
      }); 

Ergebnis setzen wie diese

  • Name sein sollte ------------- ---- ExamTitle ------ Datum ------------- ---- LatestExamDate
  • Mike Peter --------- Französisch ------- 15/03/2015 --------- 20/12/2015
  • Mike Peter --------- Math ---------- 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 ---------- Bio -------- - 14/12/2015 --------- 14/12/2015
  • David Ula ---------- Mngmt --------- --------- 2015.10.10 14/12/2015
+0

Ist 'LatestExamDate' die neueste Prüfungstermin für den Benutzer oder die neueste Prüfungstermin für alle Prüfungen? – Rob

+0

LatestExamDate ist für den Benutzer – Maro

+0

Und Ihre Eigenschaft 'Prüfungen' - ist das richtig als eine ausländische Beziehung angeschlossen (ich nehme an, dass dies in SQL konvertiert wird?) – Rob

Antwort

1

Sie können eine bidirektionale Navigation richtig konfigurieren, um diese Abfrage viel einfacher zu machen.

Fügen Sie die folgende Eigenschaft auf Exam

public virtual Student Student { get; set; } 

und konfigurieren Sie es dann mit Ihrem vorhandenen StudentID zu arbeiten.

Ihre Anfrage wird dann:

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

Alternativ müssten Sie dies tun:

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

Vielen Dank, dass Sie sich die Zeit genommen haben, meine Frage +1 zu beantworten! Was ist, wenn ** LastExamDate ** vom Typ Exam nicht dateTime ist? Ich werde meine Frage ändern – Maro

+0

@Maro Keine Sorgen !. Du müsstest etwas tun wie ... 'uow.Exams.GetAll(). Wo (e => e.StudentId == s.Id) .OrderByDescending (e => e.ExamDate) .FirstOrDefault()' (nicht getestet, aber die Idee sollte funktionieren). Die 'OrderByDescending/FirstOrDefault' anstelle von' Max' Änderung sollte für beide Beispiele funktionieren – Rob

+0

Thx ich werde es versuchen. – 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' ist keine Sammlung, es ist eine Zeile. – Rob

+0

Ich habe das lassen Sie mich nur korrigieren –

+0

Werfen Sie einen Blick auf diese –