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

时间:2015-03-27 03:34:29

标签: c# sql-server linq entity-framework linq-to-entities

我有一张名为' Samples'使用以下列: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);

但是我得到了这个例外:

  

类型' System.NotSupportedException'的例外情况发生在EntityFramework.SqlServer.dll中但未在用户代码中处理   附加信息:指定的类型成员'日期' LINQ to Entities不支持。仅支持初始化程序,实体成员和实体导航属性。

1 个答案:

答案 0 :(得分:0)

请参阅以下更新

假设SampleTime的类型为System.DateTime,您可以将GroupBy更改为.GroupBy(n => n.SampleTime.Hour),这样您就可以计算每小时的平均值。请注意,DateTime.Hour会返回0到23之间的小时数。


尝试以下内容。我稍微简化了一下,但如果你可以验证它是否有效,你可以将它重塑为你正在尝试的全部内容。此外,我很难对其进行测试,因为我首先构建了样本数据。正在进行的解释(LINQ to SQL限制)是here,并且有关如何通过AsEnumerable()更容易解决限制的有用提示是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();