首页 > 解决方案 > 以间隔查询日期时间范围

问题描述

我想查询每个结果间隔为 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>

标签: c#linqentity-framework-core-2.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应该使用的定义<=和主键以防止返回同一行,但您没有提供该信息。

请注意,如果要测试大量行,这可能会呈指数级增长。在这种情况下,您最好在客户端返回行和处理,或者使用带有ROWNUMBER.


推荐阅读