我有 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 开始出现故障,我不希望它的记录出现在该时间戳之后。
device2 也一样
因此,作为最终结果,我只想获得所有设备的数据,直到它们获得第一个 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);
问题是如果一个设备永远不会出故障,我根本就不知道它的历史。
最佳答案
基本上你需要“不存在”条件,即获取所有不存在 DeviceStatusHistory
记录且具有相同 DeviceId
的 History
记录, Status == 0
和更大的Timestamp
。
在 LINQ 中具有导航属性的是用 !Any(...)
条件而不是 FirstOrDefault()
表示的:
.Where(h => !h.Device.DeviceStatusHistory.Any(st =>
st.Status == 0 && st.TimeStamp > h.DeviceTimeStamp));
关于c# - Entity Framework 查询 - 从另一个表中选择直到时间戳的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63421253/