返回每个间隔时间段的最大版本号时间戳

问题描述 投票:0回答:1

我有一个包含以下字段的数据集:

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

这将返回按Interval Period Timestamp排序的列表,然后返回Replacement Version,但我只想返回MAX信号的间隔信息​​列表。我已经能够使用代码在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语句

entity-framework group-by
1个回答
0
投票

尝试这样的事情:将您的项目分组到您只需要一条记录的不同组中,按照后代顺序按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列表中包含在每个组中具有相同值的属性组合,以及其他组中的不同值。

© www.soinside.com 2019 - 2024. All rights reserved.