c# - Entity Framework 查询 - 从另一个表中选择直到时间戳的记录

标签 c# entity-framework-core

我有 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 记录且具有相同 DeviceIdHistory 记录, 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/

相关文章:

c# - C#从串口读取字节流

c# - 通用列表。首先不工作 LINQ

c# - 无法使用 SteamKit2 连接到 steam

c# - 使用 Phonics Sounds 的文字转语音

c# - EF Core 在映射到 Select 中的对象时查询 SQL 中的所有列

entity-framework-core - EF 核心 : updating an entity without querying it first

c# - 一侧没有引用属性的一对一关系

c# - 无法确定条件表达式的类型,因为 'lambda expression' 和 'lambda expression' 之间没有隐式转换

c# - 如果所有配置都在 DbContext 的 OnConfiguring 方法中,如何使用 AddDbContextPool

c# - 如何使用 EF Core 执行 RAW SQL 查询?