【问题标题】:Query Date Time Range with interval以间隔查询日期时间范围
【发布时间】:2019-05-26 01:42:34
【问题描述】:

我想查询每个结果的时间间隔为 10 秒或更长的日期时间范围。有没有一种方法可以让我在单个查询中使用 Linq 或 Expression 进行查询,而无需遍历所有结果来执行间隔。

船位模型设计

  - Id (int)
  - MMSI (int)
  - Latitude (decimal)
  - Longitude (decimal)
  - LocalRecvTime (datetime)

我仍然不知道该怎么做。

 dbContext.ShipPositions.Where(c => c.MMSI == m.MMSI &&
                        c.LocalRecvTime >= m.FromDateTime && c.LocalRecvTime < m.ToDateTime)

我希望结果应该是这样的,其中第 2 行和第 1 行的差异应该是 10 秒或更多

<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" rel="stylesheet"/>
<table class="table table-hover table-bordered table-striped table-condensed">
<thead>
    <th>
      MMSI      
    </th>
     <th>
      Date Time      
    </th>
    </thead>
    <tbody>
      <tr>
        <td>123</td>
        <td>14:10:23</td>
      </tr>
      <tr>
        <td>123</td>
        <td>14:10:33</td>
      </tr>
      <tr>
        <td>123</td>
        <td>14:10:46</td>
      </tr>
    </tbody>
</table>

【问题讨论】:

  • 是否有可能有两个相等的时间戳?
  • 你能显示ShipPositions的完整定义吗?它有主键吗?
  • @NetMage 不。结果不能有相同的时间戳,是的,ShipPosition 确实有一个主键

标签: c# linq entity-framework-core-2.1


【解决方案1】:

给定

var src = dbContext.ShipPositions.Where(c => c.MMSI == m.MMSI &&
                    c.LocalRecvTime >= m.FromDateTime && c.LocalRecvTime < m.ToDateTime);

可以找到上一行,然后比较时间如下:

var ans = from sp in src
          let prev = src.Where(s => s.LocalRecvTime < sp.LocalRecvTime).OrderByDescending(s => s.LocalRecvTime).First().LocalRecvTime
          where prev == null || EF.Functions.DateDiffSecond(prev, sp.LocalRecvTime) >= 10
          select sp;

理想情况下,prev 的定义应使用&lt;= 和主键来防止返回同一行,但您没有提供该信息。

请注意,如果要测试大量行,这可能会成倍地变慢。在这种情况下,您最好在客户端返回行和处理,或者使用带有ROWNUMBER 的 SQL 存储过程。

【讨论】:

  • 如果我像你说的那样使用主键,它仍然会影响性能吗?因为它可能会处理大量的行
  • @hafizabdullah 如果主键是有序的,使用主键来限制子查询应该会极大地提高性能——我可以期望主键按时间升序排列LocalRecvTime 吗?我将更改代码。
  • 我刚刚查过了,很遗憾没有。主节点不是按时间升序排列到 LocalRecvTime
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 2021-11-15
  • 1970-01-01
  • 2013-10-22
  • 2013-03-04
相关资源
最近更新 更多