C# 按Linq中的时间范围分组

C# 按Linq中的时间范围分组,c#,.net,linq,C#,.net,Linq,今天我第一次陷入了一些linq查询中,我正在努力解决一些更复杂的问题。我正在构建一个查询,从表中提取数据以构建一个图形。我感兴趣的表格有Id、Time和Value 用户将选择开始时间、结束时间和要绘制的间隔数(点)。值列将为每个间隔取平均值 我可以对每个时间间隔使用linq请求来实现这一点,但我尝试在一个查询中编写它,所以我只需要访问数据库一次 到目前为止,我得到了: var timeSpan = endTime.Subtract(startTime); var intervalInSecond

今天我第一次陷入了一些linq查询中,我正在努力解决一些更复杂的问题。我正在构建一个查询,从表中提取数据以构建一个图形。我感兴趣的表格有IdTimeValue

用户将选择开始时间、结束时间和要绘制的间隔数(点)。值列将为每个间隔取平均值

我可以对每个时间间隔使用linq请求来实现这一点,但我尝试在一个查询中编写它,所以我只需要访问数据库一次

到目前为止,我得到了:

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();
查询速度会慢一些