2012-05-25 1 views
3

Я работаю над системой обработки показаний счетчика.Показать 3 результата из каждого элемента в группе

Я хочу создать выход, где система отображает все счетчики, принадлежащие клиенту, и для каждого счетчика - три последних показания.

До сих пор, я должен followering код:

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

Теперь он показывает все счетчики, принадлежащие заказчику. Если я положил .take (3), он отображает только первые 3 результата.

Thx! Daniel

+0

является 'maalers' опечатка? –

ответ

0

Я думаю, что вам нужно поставить .Снять (3) в нужном месте. В вашем случае вы, вероятно, сделали результат. Возьмите (3), но это означает, что первые три группы (со всеми их элементами).

Ниже приведена попытка показать, что я имею в виду, однако, полагаю, вам нужно будет исправить это в последней части, так как у меня нет данных для ее проверки, и поэтому я не уверен, что то, что я пытаюсь получить доступ, доступно в этот момент. Но я надеюсь, что вы поняли, что я имею в виду.

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

Хм, он говорит, что метры. В этом контексте не существует (3). Я неправильно указал метры, но он все еще говорит, что этого не существует. – Knaks

+0

Извините, я прочитал ваш ответ неправильно. Он все еще показывает все счетчики ... – Knaks

0

Вы хотите только группе MeterNumber. Как вы сейчас группируете группу, вы получите новую группу для каждой уникальной комбинации MeterNumber-Consumption-Date.

Вы также можете упростить свой запрос с помощью оператора LINQ GroupJoin. В запросе синтаксис вы используете "join..on..into" узор:

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

Или, используя точечную нотацию:

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)) 
    ; 
Смежные вопросы