Show 3 results for each item in a group by

I am working on a meter processing system.

I want to create an output where the system displays all the counters belonging to the client, and for each counter, the last three readings.

So far I have to stick with the code:

 var lastMeterReading = from meeters in metermodel.Meeters
                              join reading in metermodel.Readings on meeters.MeterNumber equals reading.MeterNumber
                              where (maalers.CustNo == 6085574)
                              orderby reading.Date descending
                              group meeters by new { meeters.MeterNumber, reading.Consumption, reading.Date } into result
                              select new
                              {
                                  Consumption = result.Key.Consumption, No = result.Key.MeterNumber, Date = result.Key.Date
                              };

Now it shows all the counters belonging to the client. If I put .take (3), it only displays the first 3 results.

thank! Daniel

+3
source share
3 answers

I think you need to put .Take (3) in the right place. In your case, you probably did result.Take (3), but that means the first three groups (with all their elements).

, , , , , , , . , , .

var lastMeterReading = (from meeters in metermodel.Meeters
                       join reading in metermodel.Readings on meeters.MeterNumber equals reading.MeterNumber
                       where (maalers.CustNo == 6085574)
                       orderby reading.Date descending
                       group meeters by new { meeters.MeterNumber, reading.Consumption, reading.Date } into result
                       from m in result
                       select new {Key = m.Key, Info = result.OrderByDescending(r => r.Date).Take(3)})
                       .Select(r => new 
{ Consumption = r.Consumption, No = r.MeterNumber, Date = r.Date });
0

:

var lastMeterReading = from meeters in metermodel.Meeters
                       join reading in metermodel.Readings on meeters.MeterNumber equals reading.MeterNumber
                       where (maalers.CustNo == 6085574)
                       orderby reading.Date descending
                       group meeters by new { meeters.MeterNumber, reading.Consumption, reading.Date } into result
                       from m in result.Take(3)
                       select new
                       {
                           Consumption = m.Consumption, No = m.MeterNumber, Date = m.Date
                       };
0

You want to group only MeterNumber. As you group the group now, you will get a new group for each unique combination of MeterNumber-Consumption-Date.

You can also simplify your query with the LINQ GroupJoin statement. In the query syntax, you use the "join..on..into" template:

from meter in meterModel.Meters
  where (meter.CustNo == 6085574)
  join reading in meterModel.Readings
  on meter.MeterNumber equals reading.MeterNumber
  into meterGroup
  select meterGroup.OrderByDescending(r => r.Date).Take(3);

Or using dot notation:

meterModel.Meters
    .Where(x => x.CustNo == 6085574)
    .GroupJoin(
        meterModel.Readings, 
        meter => meter.MeterNumber, 
        reading => reading.MeterNumber, 
        (meter,readings) => readings.OrderByDescending(r => r.Date).Take(3))
    ;
0
source

All Articles