如何获取我的数据的每小时平均值
How to get hourly averages of my data
我有一个名为 'Samples' 的 table,其中包含以下列:Id、Type、Quantity、Unit、SampleTime。
我有以下计算每日平均体重的语句:
weightchart.data = db.Samples
.Where(n => n.Type == "weight")
.GroupBy(n => DbFunctions.TruncateTime(n.SampleTime))
.Select(item => new ChartData()
{
timestamp = item.Key,
average = item.Average(a => a.Quantity),
max = item.Max(a => a.Quantity),
min = item.Min(a => a.Quantity),
count = item.Count()
}).OrderBy(n => n.timestamp).ToList();
charts.Add(weightchart);
现在我想获得每小时平均值。我不知道该怎么做。我是 c#、linq 和实体的新手。
更新: 我已将声明更新为:
weightchart.data = db.Samples.Where(n => n.Type == "weight").GroupBy(n => new { Date = n.SampleTime.Date, Hour = n.SampleTime.Hour }).Select(item => new ChartData()
{
timestamp = new DateTime(item.Key.Date.Year, item.Key.Date.Month, item.Key.Date.Day, item.Key.Date.Hour, 0, 0),
average = item.Average(a => a.Quantity),
max = item.Max(a => a.Quantity),
min = item.Min(a => a.Quantity),
count = item.Count()
}).OrderBy(n => n.timestamp).ToList();
charts.Add(weightchart);
但是我遇到了这个异常:
An exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll but was not handled in user code
Additional information: The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
见下方更新
假设 SampleTime
的类型是 System.DateTime
,您可以将 GroupBy
更改为 .GroupBy(n => n.SampleTime.Hour)
,这样您就可以计算每小时的平均值。请注意 DateTime.Hour
returns 从 0 到 23 的一个小时。
尝试如下操作。我稍微简化了一些,但如果您可以验证它是否有效,您可以将其重塑为您正在尝试的完整内容。此外,我很难对其进行测试,因为我会先构建样本数据)。对正在发生的事情的解释(LINQ to SQL 限制)是 here and a helpful hint on how to more easily get around the limitation via AsEnumerable() is here.
var dataAsList = (from n in db.Samples.Where(n => n.Type == "weight").AsEnumerable()
group n by new { Date = n.SampleTime.Date, Hour = n.SampleTime.Hour } into g
select new
{
dategrouping = g.Date,
hourgrouping = g.Hour,
average = g.Average(a => a.Quantity),
max = g.Max(a => a.Quantity),
min = g.Min(a => a.Quantity),
count = g.Count()
}).ToList();
我有一个名为 'Samples' 的 table,其中包含以下列:Id、Type、Quantity、Unit、SampleTime。
我有以下计算每日平均体重的语句:
weightchart.data = db.Samples
.Where(n => n.Type == "weight")
.GroupBy(n => DbFunctions.TruncateTime(n.SampleTime))
.Select(item => new ChartData()
{
timestamp = item.Key,
average = item.Average(a => a.Quantity),
max = item.Max(a => a.Quantity),
min = item.Min(a => a.Quantity),
count = item.Count()
}).OrderBy(n => n.timestamp).ToList();
charts.Add(weightchart);
现在我想获得每小时平均值。我不知道该怎么做。我是 c#、linq 和实体的新手。
更新: 我已将声明更新为:
weightchart.data = db.Samples.Where(n => n.Type == "weight").GroupBy(n => new { Date = n.SampleTime.Date, Hour = n.SampleTime.Hour }).Select(item => new ChartData()
{
timestamp = new DateTime(item.Key.Date.Year, item.Key.Date.Month, item.Key.Date.Day, item.Key.Date.Hour, 0, 0),
average = item.Average(a => a.Quantity),
max = item.Max(a => a.Quantity),
min = item.Min(a => a.Quantity),
count = item.Count()
}).OrderBy(n => n.timestamp).ToList();
charts.Add(weightchart);
但是我遇到了这个异常:
An exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll but was not handled in user code Additional information: The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
见下方更新
假设 SampleTime
的类型是 System.DateTime
,您可以将 GroupBy
更改为 .GroupBy(n => n.SampleTime.Hour)
,这样您就可以计算每小时的平均值。请注意 DateTime.Hour
returns 从 0 到 23 的一个小时。
尝试如下操作。我稍微简化了一些,但如果您可以验证它是否有效,您可以将其重塑为您正在尝试的完整内容。此外,我很难对其进行测试,因为我会先构建样本数据)。对正在发生的事情的解释(LINQ to SQL 限制)是 here and a helpful hint on how to more easily get around the limitation via AsEnumerable() is here.
var dataAsList = (from n in db.Samples.Where(n => n.Type == "weight").AsEnumerable()
group n by new { Date = n.SampleTime.Date, Hour = n.SampleTime.Hour } into g
select new
{
dategrouping = g.Date,
hourgrouping = g.Hour,
average = g.Average(a => a.Quantity),
max = g.Max(a => a.Quantity),
min = g.Min(a => a.Quantity),
count = g.Count()
}).ToList();