如何获取我的数据的每小时平均值

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();