c# - 以间隔查询日期时间范围
问题描述
我想查询每个结果间隔为 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>
解决方案
给定
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
.
推荐阅读
- javascript - 单击外部时如何隐藏输入?
- r - 类似于 Excel 中的 AVERAGEIFS 的条件平均值
- ios - 如何从本地文件(角度)在nativescript中插入图像
- python - 使用python存档中包含的信息重命名zipfile
- java - 添加 JFreeChart 和 JCommon 库后无法访问类型 org.jfree.chart.JFreeChart
- r - 更改 R 的版本是否也需要更改 Rstudio 版本?
- docker - 将standalone.xml 添加到JBoss WildFly Docker 容器
- swift - 在第一个 viewController 中按下 UItableView 滚动时,如何使用 NSPredicate 获取请求并用数据填充第二个 viewController
- r - 缺少上限时仍绘制 CI 的下限
- angular - AOt 编译没有这样的文件或目录