C# 按Linq中的时间范围分组
今天我第一次陷入了一些linq查询中,我正在努力解决一些更复杂的问题。我正在构建一个查询,从表中提取数据以构建一个图形。我感兴趣的表格有Id、Time和Value 用户将选择开始时间、结束时间和要绘制的间隔数(点)。值列将为每个间隔取平均值 我可以对每个时间间隔使用linq请求来实现这一点,但我尝试在一个查询中编写它,所以我只需要访问数据库一次 到目前为止,我得到了:C# 按Linq中的时间范围分组,c#,.net,linq,C#,.net,Linq,今天我第一次陷入了一些linq查询中,我正在努力解决一些更复杂的问题。我正在构建一个查询,从表中提取数据以构建一个图形。我感兴趣的表格有Id、Time和Value 用户将选择开始时间、结束时间和要绘制的间隔数(点)。值列将为每个间隔取平均值 我可以对每个时间间隔使用linq请求来实现这一点,但我尝试在一个查询中编写它,所以我只需要访问数据库一次 到目前为止,我得到了: var timeSpan = endTime.Subtract(startTime); var intervalInSecond
var timeSpan = endTime.Subtract(startTime);
var intervalInSeconds = timeSpan.TotalSeconds / intervals;
var wattList = (from t in _table
where t.Id == id
&& t.Time >= startTime
&& t.Time <= endTime
group t by intervalInSeconds // This is the bit I'm struggling with
into g
orderby g.Key
select g.Average(a => a.Value))
).ToList();
var timeSpan=endTime.Subtract(开始时间);
var intervalInSeconds=timeSpan.TotalSeconds/间隔;
var wattList=(来自表中的t
其中t.Id==Id
&&t.时间>=开始时间
&&t.Time看看我不久前写的这个例子。它听起来像是你要做的,但我不确定它是在SQL中还是在.NET中进行分组
看看我刚才写的这个例子。这听起来像是你想做的,但我不确定它是用SQL还是用.NET进行分组
也许你可以做如下事情:
var wattList = (from t in _table
where t.Id == id
&& t.Time >= startTime
&& t.Time <= endTime
).GroupBy(x => (int) ((x.Time - startTime).TotalSeconds / intervalInSeconds))
.Select(grp => grp.Average(x => x.Value));
var-wattList=(来自表中的t
其中t.Id==Id
&&t.时间>=开始时间
&&t.时间(int)((x.时间-开始时间.总秒/间隔秒))
.选择(grp=>grp.Average(x=>x.Value));
也许你可以做如下事情:
var wattList = (from t in _table
where t.Id == id
&& t.Time >= startTime
&& t.Time <= endTime
).GroupBy(x => (int) ((x.Time - startTime).TotalSeconds / intervalInSeconds))
.Select(grp => grp.Average(x => x.Value));
var-wattList=(来自表中的t
其中t.Id==Id
&&t.时间>=开始时间
&&t.时间(int)((x.时间-开始时间.总秒/间隔秒))
.选择(grp=>grp.Average(x=>x.Value));
我自己做这件事的目的和你描述的情况完全一样
为了提高速度,修改数据库的datapoints表以包含基于整数的时间列,SecondsSince2000
,然后在我的LINQ to SQL查询中使用该值。SecondsSince2000
是一个计算列,定义为:
datediff(second, dateadd(month,1200,0), DataPointTimeColumn) PERSISTED
其中,DataPointTimeColumn
是存储数据点时间的列的名称。神奇的函数调用dateadd(month,1200,0)
在午夜返回2000-01-01,因此该列存储自该时间起的秒数
然后,LINQ到SQL查询变得更简单、更快:
int timeSlotInSeconds = 60;
var wattList =
(from t in _table
where t.Id == id
&& t.Time >= startTime
&& t.Time <= endTime
group t by t.SecondsSince2000 - (t.SecondsSince2000 % timeSlotInSeconds)
into g
orderby g.Key
select g.Average(a => a.Value))).ToList();
int timeSlotInSeconds=60;
var瓦特列表=
(来自t in_表)
其中t.Id==Id
&&t.时间>=开始时间
&&t.Time a.Value)).ToList();
如果无法修改数据库,您仍然可以执行以下操作:
var baseTime = new DateTime(2000, 1, 1);
var wattList =
(from t in _table
where t.Id == id
&& t.Time >= startTime
&& t.Time <= endTime
let secondsSince2000 = (int)(t.Time- baseTime).TotalSeconds
group t by secondsSince2000 - (secondsSince2000 % timeSlotInSeconds)
into g
orderby g.Key
select g.Average(a => a.Value))).ToList();
var baseTime=newdatetime(2000,1,1);
var瓦特列表=
(来自t in_表)
其中t.Id==Id
&&t.时间>=开始时间
&&t.Time a.Value)).ToList();
查询速度会慢一些。我自己也这样做过,与您描述的情况完全相同
为了提高速度,修改了数据库的datapoints表以包含基于整数的时间列,SecondsSince2000
,然后在我的LINQ to SQL查询中使用该值SecondsSince2000
是一个计算列,定义为:
datediff(second, dateadd(month,1200,0), DataPointTimeColumn) PERSISTED
其中DataPointTimeColumn
是存储数据点时间的列的名称。神奇的函数调用dateadd(month,1200,0)
在午夜返回2000-01-01,因此该列存储从那时起的秒数
然后,LINQ到SQL查询变得更简单、更快:
int timeSlotInSeconds = 60;
var wattList =
(from t in _table
where t.Id == id
&& t.Time >= startTime
&& t.Time <= endTime
group t by t.SecondsSince2000 - (t.SecondsSince2000 % timeSlotInSeconds)
into g
orderby g.Key
select g.Average(a => a.Value))).ToList();
int timeSlotInSeconds=60;
var瓦特列表=
(来自t in_表)
其中t.Id==Id
&&t.时间>=开始时间
&&t.Time a.Value)).ToList();
如果无法修改数据库,您仍然可以执行以下操作:
var baseTime = new DateTime(2000, 1, 1);
var wattList =
(from t in _table
where t.Id == id
&& t.Time >= startTime
&& t.Time <= endTime
let secondsSince2000 = (int)(t.Time- baseTime).TotalSeconds
group t by secondsSince2000 - (secondsSince2000 % timeSlotInSeconds)
into g
orderby g.Key
select g.Average(a => a.Value))).ToList();
var baseTime=newdatetime(2000,1,1);
var瓦特列表=
(来自t in_表)
其中t.Id==Id
&&t.时间>=开始时间
&&t.Time a.Value)).ToList();
查询速度会慢一些