查询日期时间间隔

时间:2018-12-28 07:20:40

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

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

ShipPosition模型设计

  - 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>

1 个答案:

答案 0 :(得分:0)

给予

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的SQL存储过程。