1

我有一个“大”(数十万行)表(称为数据点)。另一个与数据点具有一对多关系的“事件”表。events 表有一个 TimeStamp 类型的列DateTimeOffset。我想查询某个时间范围内的所有数据点,但有一个重要警告:我需要插值到输入截止时间。

例如:假设我在过去的随机分布时间(-1 小时、-5 小时、-8 小时、-11 小时和 -13 小时)有事件。这些事件中的每一个都创建了一些数据点,我想查询过去 12 小时内的所有数据点。我需要获取与所有这些点相关的数据点(包括 -13 小时点)。这样做的原因是因为我需要截止时间(-12 小时)的数据,因此我需要 -11 小时点和 -13 小时点,因此我可以插值到 -12 小时。我不能只是简单地说where dataPoint.Event.Time > currentTime - 12,我还需要再得到一分。

有没有办法在 LINQ to SQL 中表达这一点?我只提出了2个想法:

1)使用一些启发式方法(将截止值乘以 2)以确保我有足够的分数。这不是健壮的并且可能是浪费的。

2)首先查询所有事件,对它们进行排序,通过手动滚动确定哪个事件是我想要的最后一个事件,然后查询时间戳小于计算事件的所有数据点。这个需要很多代码,也很浪费。

还有其他想法吗?

4

1 回答 1

1

我会这样做:

  1. 查询包括截止日期时间在内的所有事件
  2. 查询比步骤 1 中拉取的最后一个事件更早的第一个事件

如果 datetime 列上有索引,则两者都将快速执行。唯一的问题是额外的往返。

这与您的想法 2 类似,但您最多只需要在步骤 2 中查询一个事件。我认为这不需要很多代码。

查询 2 如下所示:

(from e in db.Events
where e.DateTime < lastDateTime
order by e.DateTime
select e).Take(1)

这会导致索引查找返回一行。非常有效率。

于 2012-08-13T17:10:46.540 回答