我将传感器数据存储在sql数据库中。每个条目都有device_id,时间戳,值和一些其他属性。
我想实现一个webapi函数,它返回我从传感器设备收到的第一个和最后一个事件。所以我的序列化DTO应该是这样的:
{ "start": <timestamp:long>, "end": <timestamp:long>, "deviceid": <someid:string>}
我正在使用Entityframework Core来访问我的数据库。我可以毫无问题地获得唯一设备ID列表。如果我尝试获取每个设备的时间戳的最小值或最大值,我的dbcontext会抛出无效的操作异常。
我尝试了几样这样的事情:
var deviceList=_context.Data.Select(d=>d.DeviceId).Distinct();
foreach(string deviceId in deviceList)
{
var max = _context.Data.Where(g=>g.DeviceId==deviceId).Max(c=>c.Timestamp);
var min ...
}
此代码段会从clr引发无效的操作异常。据我所知,它创建了一个不在服务器端执行的语句。我的问题是我如何创建一个请求dbcontext上的最小值和最大值(每个设备)的查询?此外,我想知道实现这个的推荐方法,以便它不会在客户端执行。
谢谢Werner。
答案 0 :(得分:0)
我希望你的_context.Data
引用表中的所有记录(行)。并且您可以使用group by
来获取它。尝试下面的一个,让我知道它是否适合你。
首先我们按设备ID分组,然后对于每个组,我们得到最小和最大时间跨度。
var data = _context.Data.GroupBy(f => f.deviceId)
.Select(g =>
new {
deviceId = g.Key,
start = g.Min(r=>r.timestamp),
end = g.Max(r=>r.timestamp)
}
);