Возвращение максимального номера версии за интервал времени - PullRequest
0 голосов
/ 17 мая 2018

У меня есть набор данных со следующими полями:

IntervalPeriodTimestamp
RegisterTypeCode
ReadingReplacementVersion
IntervalValue

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

Используя LINQ, как я могу вернуть только список наибольшей версии чтения за полчаса?

Я пробовал:

db.IntervalInformations
  .Where(ii => ii.ChannelInformation.RegisterTypeCode == "62")
  .OrderBy(ii => ii.IntervalPeriodTimestamp)
  .ThenBy(ii => ii.ChannelInformation.Meter.messageType342.ReadingReplacementVersionNumber)
  .ToList();

Возвращает список, отсортированный по метке времени интервала, а затем по замещающей версии, но я хочу вернуть список данных интервала только с МАКСИМАЛЬНОЙ. Я смог добиться этого в SQL с помощью кода:

WITH CTE AS
(
  select SerialNumber, RegisterTypeCode, IntervalStatusCode, UOM_Code,
      IntervalPeriodTimestamp, ReadingReplacementVersionNumber, IntervalValue,
      RN = ROW_NUMBER() 
          OVER (PARTITION BY IntervalPeriodTimestamp 
          ORDER BY ReadingReplacementVersionNumber desc) 
  from MarketMessage as a
  inner join messageType342 as b on a.MarketMessageID = b.MarketMessageID
  inner join Meter as c on b.messageType342ID = c.MessageType342ID
  inner join ChannelInformation as d on c.MeterID = d.MeterID
  inner join IntervalInformation as e on d.ChannelInformationID = e.ChannelInformationID 
  where MPRN = 101010101010
  and CAST(IntervalPeriodTimestamp as date) between '1 feb 2018' and '28 feb 2018'
  and RegisterTypeCode = 62
)
select * from CTE
WHERE RN = 1

Не уверен, как я могу преобразовать это в оператор LINQ

1 Ответ

0 голосов
/ 17 мая 2018

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

db.IntervalInformations
    .Where(ii => ii.ChannelInformation.RegisterTypeCode == "62")        
    .OrderByDescending(ii => ii.ReadingReplacementVersionNumber )
    .GroupBy(x => new { x.SerialNumber, x.RegisterTypeCode, x.IntervalStatusCode })
    .Select(g => g.First());

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

...