Я хочу запросить диапазон дат и времени с интервалом 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 действительно есть первичный ключ.





Данный
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.
Если я использую первичный ключ, как вы сказали, это по-прежнему влияет на производительность? Потому что он может обрабатывать большое количество строк
@hafizabdullah Использование первичного ключа для ограничения подзапроса должно значительно повысить производительность, если первичный ключ упорядочен - могу ли я ожидать, что первичный ключ будет в хронологическом порядке возрастания LocalRecvTime? Я внесу изменение кода.
Я только что проверил, к сожалению, нет. Первичный не находится в хронологическом порядке возрастания до LocalRecvTime
Могут ли быть две одинаковые отметки времени?