我想在C#中使用特定的时间间隔从数据库中获取值,并且需要LINQ查询。 这就是我的数据库的样子
Id SensorId Value CreatedOn
1 8 33.5 15-11-2012 5:48 PM
2 5 49.2 15-11-2012 5:48 PM
3 8 33.2 15-11-2012 5:49 PM
4 5 48.5 15-11-2012 5:49 PM
5 8 31.8 15-11-2012 5:50 PM
6 5 42.5 15-11-2012 5:50 PM
7 8 36.5 15-11-2012 5:51 PM
8 5 46.5 15-11-2012 5:51 PM
9 8 39.2 15-11-2012 5:52 PM
10 5 44.4 15-11-2012 5:52 PM
11 8 36.5 15-11-2012 5:53 PM
12 5 46.5 15-11-2012 5:53 PM
13 8 39.2 15-11-2012 5:54 PM
14 5 44.4 15-11-2012 5:54 PM
.. . .... ...................
间隔以分钟为单位。 所以,如果间隔是10分钟,那么我们需要5:48,5:58,6:08的值等等......
这就是我试过的
while (startDateTime <= endDateTime)
{
var fetchIndex =
fullValues.Where(
item =>
item.CreatedOn >= startDateTime &&
item.CreatedOn < startDateTime.AddMinutes(1)).Select(
item => item.FetchIndex).FirstOrDefault();
if (fetchIndex != 0)
{
var temp = fullValues.Where(item => item.FetchIndex == fetchIndex).ToList();
result = result.Union(temp);
}
startDateTime = startDateTime.AddMinutes(interval);
}
由于while循环遍历表,因此需要花费大量时间来获取这些值。
有没有办法在单个查询中获取数据?
答案 0 :(得分:2)
from x in table
where x.CreatedOn >= startDateTime &&
x.CreatedOn <= endDateTime &&
(x.CreatedOn.Minute % 10) == 0
select x
这将给你1:00,1:10,1:20
10表示您的间隔,0表示您的偏移。
答案 1 :(得分:2)
以下方法创建一个列表requiredTimes
,其中包含startDateTime
和endDateTime
之间的所有相关日期时间(开始日期和结束日期之间的间隔时间为10分钟)。
创建这样的列表后,fullValues
内部加入了它。结果是一个IEnumerable,其日期时间来自fullValues
,满足间隔条件。它应该工作得很快,因为创建这样的列表是快速的,Join
方法是一个内连接,也应该快速,尝试它:
DateTime startDateTime = DateTime.Parse("15-11-2012 5:48 PM");
DateTime endDateTime = DateTime.Parse("16-11-2012 5:58 PM");
List<DateTime> requiredTimes = new List<DateTime>();
DateTime dt = startDateTime;
requiredTimes.Add(dt);
while (dt <= endDateTime)
{
dt = dt.AddMinutes(10);
requiredTimes.Add(dt);
}
var result = fullValues.Join(
requiredTimes,
fv => fv.CreatedOn,
rt => rt,
(fv, rt) => fv);