c# - 实体框架查询 - 仅选择记录,直到另一个表中的时间戳
问题描述
我有 2 张桌子。
第一个是History
表格 - 不同设备接收的数据。
+----------+-------------+--------------------+
| DeviceId | Temperature | TimeStamp |
+----------+-------------+--------------------+
| 1 | 31 | 15.08.2020 1:42:00 |
| 2 | 40 | 15.08.2020 1:43:00 |
| 1 | 32 | 15.08.2020 1:44:00 |
| 1 | 34 | 15.08.2020 1:45:00 |
| 1 | 20 | 15.08.2020 1:46:00 |
| 2 | 45 | 15.08.2020 1:47:00 |
+----------+-------------+--------------------+
第二个是DeviceStatusHistory
表
+----------+---------+--------------------+
| DeviceId | Status | TimeStamp |
+----------+---------+--------------------+
| 1 | 1(OK) | 15.08.2020 1:42:00 |
| 2 | 1(OK) | 15.08.2020 1:43:00 |
| 1 | 1(OK) | 15.08.2020 1:44:00 |
| 1 | 0(FAIL) | 15.08.2020 1:44:30 |
| 1 | 0(FAIL) | 15.08.2020 1:46:00 |
| 2 | 0(FAIL) | 15.08.2020 1:46:10 |
+----------+---------+--------------------+
由于 device1 从 15.08.2020 1:44:30 开始失败,我不希望它的记录在那个时间戳之后。
设备2也是如此。
因此,作为最终结果,我只想拥有所有设备的数据,直到它们获得第一个 FAIL 状态:
+----------+-------------+--------------------+
| DeviceId | Temperature | TimeStamp |
+----------+-------------+--------------------+
| 1 | 31 | 15.08.2020 1:42:00 |
| 2 | 40 | 15.08.2020 1:43:00 |
| 1 | 32 | 15.08.2020 1:44:00 |
+----------+-------------+--------------------+
我尝试过这样的事情
var query = _context
.History
.Include(h => h.Device)
.AsNoTracking()
.Where(h => h.DeviceTimeStamp <= h.Device.DeviceStatusHistory.FirstOrDefault(st => st.Status == 0).TimeStamp);
问题是,如果一个设备永远不会出现故障,我就根本不知道它的历史。
解决方案
Below SQL query works for your needs
select * from History h
where h.TimeStamp < coalesce(
(
select min(TimeStamp) from DeviceStatusHistory where Status = 0 and DeviceId = h.DeviceId
) ,Curdate()
)
If we try to translate it to linq it will be like this :
.Where(h => h.DeviceTimeStamp < (h.Device.DeviceStatusHistory
.Where(st => st.Status == 0)
.Min(st=> st.TimeStamp) ?? DateTime.Now))
推荐阅读
- php - 将自定义配置文件字段作为元数据添加到 Woocommerce 中的订单
- java - 编写 XLSX 文件(Java 相当于 python 中的 pandas 库)
- python-3.x - “Cell”对象可以成为 Python3 中引用循环的一部分吗?
- python - Python pandas 数据框对数字求和,直到它们改变
- python - 使数据库查询更便宜的优化
- rust - 如何从`dyn SuperTrait`中获取`dyn Trait`
- maven - 此处不允许显示错误元素 reportPlugins 的 maven 项目
- conditional-statements - 电源查询条件加起来,具有不同的列
- google-apps-script - 在 Google Apps 脚本上创建/保存时如何获取日历事件对象?
- c++ - 用c ++在离散间隔上选择整数