Sql server “如何连接多个”;在这段时间内最高;查询调用到一个查询中?

Sql server “如何连接多个”;在这段时间内最高;查询调用到一个查询中?,sql-server,performance,entity-framework,linq-to-entities,query-optimization,Sql Server,Performance,Entity Framework,Linq To Entities,Query Optimization,假设我们有(剥离的)实体: Message { int MessageID; int DeviceID; DateTime Timestamp; string Value; }; Device { int DeviceID; string name; byte Type; }; 我们有10000台设备,每台设备在两年内每分钟最多发送5条状态信息,这些信息都会进入数据库。现在,我们想为-500个类型==254的选定设备创建实时报告,它允许您选择

假设我们有(剥离的)实体:

Message
{
    int MessageID;
    int DeviceID;
    DateTime Timestamp;
    string Value;
};

Device
{
   int DeviceID;
   string name;
   byte Type;
};
我们有10000台设备,每台设备在两年内每分钟最多发送5条状态信息,这些信息都会进入数据库。现在,我们想为-500个类型==254的选定设备创建实时报告,它允许您选择某个时间段、间隔(每天、每2小时、每5分钟或每5秒)以及在每个生成的时间戳上,您将获得该时间戳之前的最后一条消息。我已尝试创建此查询,但无法一次查询一个时间戳(时刻):

DateTime timestamp = // from argument

var query = from message in this.Messages
    .Include(msg => msg.Device)
    where message.Timestamp <= timestamp
    && msg.Device.Type == 254
    group message by message.DeviceID into g
    select (from message in g
        orderby message.Timestamp descending
        select message).FirstOrDefault();
DateTime timestamp=//来自参数
var query=来自此.Messages中的消息
.Include(msg=>msg.Device)

where message.Timestamp除了
设备id
之外,我还会尝试通过某种“
IntervalID
”来扩展分组。
IntervalID
将是一个整数,它对时段开始和结束之间的间隔进行编号。您将有三个参数作为查询的输入:

DateTime periodStart=。。。;
DateTime periodEnd=。。。;
整数间隔=…;//单位=秒,例如,5分钟等于300,以此类推。
评估期内给定消息的
IntervalID
是一个在查询过程中“动态”计算的属性,在.NET中,它将是:

IntervalID=Math.Floor((msg.Timestamp-periodStart).TotalSeconds/间隔);
您很可能无法在LINQ to Entities查询中直接使用此表达式,因为可能不支持两个
DateTime
值的减号运算符。(
Math.Floor
受LINQ to Entities支持。)但您可以尝试用
EntityFunctions
(或
DbFunctions
替换为EF>=6)。整个查询可以如下所示:

DateTime periodStart=。。。;
DateTime periodEnd=。。。;
整数间隔=…;//单位=秒,例如,5分钟等于300,以此类推。
var query=来自此.Messages中的消息
其中message.Timestamp>=periodStart
&&消息。时间戳