LINQ statement to aggregate data
It seems like you could do this:

var results = 
    (from d in ctx.Dramas
     where !d.Resolved
     group d by new { d.Student, DateHappened = d.DateHappened.ToString("ddMMyy") } into g
     select new
     {
         Student = g.Key.Student,
         DateHappened = g.Key.DateHappened,
         EquipmentDrama = g.Any(d =&gt; d.DramaType == DramaType.Equipment),
         HomeworkDrama = o.Any(d =&gt; d.DramaType == DramaType.Homework),
         IsFlagged = o.Any(d =&gt; d.DramaType == DramaType.Flagged),
         Dramas = g.Select(d =&gt; new 
             {
                 d.Id,
                 TeacherName = d.Teacher.FirstName + " " + d.Teacher.LastName,
                 d.DateForDetention
             })
     });


NOTE: as far as I can tell, there's nothing limiting Teacher (or DateForDetention) to be the same in all grouped dramas; each drama could have a different Teacher. Here's an alternative that includes the teacher in the grouping:

var results = 
    (from d in ctx.Dramas
     where !d.Resolved
     group d by new { d.Student, d.Teacher, DateHappened = d.DateHappened.ToString("ddMMyy") } into g
     select new
     {
         Student = g.Key.Student,
         DateHappened = g.Key.DateHappened,
         EquipmentDrama = g.Any(d =&gt; d.DramaType == DramaType.Equipment),
         HomeworkDrama = o.Any(d =&gt; d.DramaType == DramaType.Homework),
         IsFlagged = o.Any(d =&gt; d.DramaType == DramaType.Flagged),
         TeacherName = d.Key.Teacher.FirstName + " " + d.Key.Teacher.LastName,
         Dramas = g.Select(d =&gt; new 
             {
                 d.Id,
                 d.DateForDetention
             })
     });


Of course, you could do the same for DateForDentention if you wanted.