Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 返回每个间隔时间段时间戳的最大版本号_Entity Framework_Group By - Fatal编程技术网

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
列表中包含在每个组中具有相同值,而在其他组中具有不同值的属性组合