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
&&消息。时间戳