Диапазон даты и времени запроса с интервалом - PullRequest
0 голосов
/ 28 декабря 2018

Я хочу сделать запрос с диапазоном даты и времени с интервалом 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 голосов
/ 28 декабря 2018

Учитывая

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 следует использовать <=, аПервичный ключ, чтобы предотвратить возврат той же строки, но вы не предоставили эту информацию.

Обратите внимание, что это может быть экспоненциально медленным, если нужно протестировать большое количество строк.В этом случае вам лучше вернуть строки и обработать их на стороне клиента или использовать хранимую процедуру SQL с ROWNUMBER.

...