Entity framework 返回每个间隔时间段时间戳的最大版本号
我有一个包含以下字段的数据集:Entity framework 返回每个间隔时间段时间戳的最大版本号,entity-framework,group-by,Entity Framework,Group By,我有一个包含以下字段的数据集: IntervalPeriodTimestamp RegisterTypeCode ReadingReplacementVersion IntervalValue 我每30分钟收到一次读数,但有时这些读数会被替换,并且ReadingReplacementVersionMember会递增 使用LINQ,我如何才能在每半小时内只返回最大的reading replacementversion列表 我试过: db.IntervalInformations .Where
IntervalPeriodTimestamp
RegisterTypeCode
ReadingReplacementVersion
IntervalValue
我每30分钟收到一次读数,但有时这些读数会被替换,并且ReadingReplacementVersionMember会递增
使用LINQ,我如何才能在每半小时内只返回最大的reading replacementversion列表
我试过:
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语句请尝试以下操作:将项目分组到只需要一条记录的不同组中,按子代顺序对记录进行排序,然后获取每组中的第一条记录。使用一些代码更容易理解:
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
列表中包含在每个组中具有相同值,而在其他组中具有不同值的属性组合