1

I have the following LINQ query but i want to modify it that I want to group by staffId and pick only those records whose ObservationDate is Max for each staffId.

from ob in db.TDTObservations.OfType<TDTSpeedObservation>()
select new
{
   Id = ob.ID,
   AcademicYearId = ob.Teachers.FirstOrDefault().Classes.FirstOrDefault().AcademicYearID,
   observationDate = ob.ObservationDate,
   schoolId = ob.Teachers.FirstOrDefault().Classes.FirstOrDefault().SchoolID,
   staffId=ob.Teachers.FirstOrDefault().ID
};
Sergey Berezovskiy
  • 232,247
  • 41
  • 429
  • 459
Manoj Pilania
  • 664
  • 1
  • 7
  • 18

2 Answers2

1
var observations = 
    from ob in db.TDTObservations.OfType<TDTSpeedObservation>()
    select new  {
       Id = ob.ID,
       AcademicYearId = ob.Teachers.FirstOrDefault().Classes.FirstOrDefault().AcademicYearID,
       observationDate = ob.ObservationDate,
       schoolId = ob.Teachers.FirstOrDefault().Classes.FirstOrDefault().SchoolID,
       staffId=ob.Teachers.FirstOrDefault().ID
    };

var result = from o in observations
             group o by o.staffId into g
             select g.OrderByDescending(x => x.observationDate).First();
Sergey Berezovskiy
  • 232,247
  • 41
  • 429
  • 459
0

what about this: hereby you first group your entries (Teachers) by their ID together and then from each group (grp) you pick that one with the latest ObservationDate

var observations = from d in db.TDTObservations.OfType<TDTSpeedObservation>()
                   group d by d.Teachers.FirstOrDefault().ID into grp
                   select grp.OrderByDescending(g => g.ObservationDate).FirstOrDefault();
LM358
  • 141
  • 9
  • Could you please elaborate more your answer adding a little more description about the solution you provide? – abarisone May 30 '16 at 10:08