Steve Crane
Steve Crane

Reputation: 4440

LINQ query to return first item in an ordered grouping

Grouping is an area of LINQ that I haven't quite managed to get my head around yet. I have the following code:

  var subTrips = tbTripData
                  .Where(t => selectedVehicleIds.Contains(t.VehicleID))
                  .Join(tbSubTripData,
                      t => t.TripID,
                      s => s.TripID,
                      (t, s) => new { t = t, s = s })
                  .Select(r => 
                      new SubTrip
                      {
                          VehicleID = r.t.VehicleID,
                          TripID = r.t.TripID,
                          Sequence = r.s.Sequence,
                          TripDistance = r.s.TripDistance,
                          Odometer = r.s.Odometer
                      })
                  .ToList();

I'm trying to figure out a LINQ query that will look at subTrips and for each VehicleID, find the first Odometer, i.e. the Odometer corresponding to the lowest TripID and Sequence values.

I've been poking at it for an hour but just can't figure it out. Can anyone offer some advice before I give up and write procedural code to do it?

UPDATE: To clarify, Sequence is the sequential number of each subtrip within a trip. So what I'm looking for is the Odometer from the first subtrip for each vehicle when the subtrips within each grouped VehicleID are ordered by TripID then by Sequence.

Upvotes: 0

Views: 60

Answers (1)

Smeegs
Smeegs

Reputation: 9224

I'm not 100% what you're looking for. But this might get you started in the right direction.

var groupedList = (from s in subTrips

            group s by s.VehicleID
                into grp
                select new
                {
                    VehicleID = grp.Key,
                    Odometer = grp.OrderBy(ex => ex.TripID).Select(ex => ex.Odometer).First(),
                    TripID = grp.Min(ex => ex.TripID)
                }
    ).ToList();

This will return the VehicleID, the Odometer corresponding to the lowest TripID, and the lowest TripID.

Upvotes: 1

Related Questions