Manoj Pilania
Manoj Pilania

Reputation: 666

LINQ Query for GroupBy and Max in a Single Query

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

Upvotes: 1

Views: 87

Answers (2)

LM358
LM358

Reputation: 141

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();

Upvotes: 0

Sergey Berezovskiy
Sergey Berezovskiy

Reputation: 236328

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();

Upvotes: 1

Related Questions