【问题标题】:How to get hourly averages of my data如何获取我的数据的每小时平均值
【发布时间】:2015-03-27 03:34:28
【问题描述】:

我有一个名为“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);

但是我得到了这个异常:

EntityFramework.SqlServer.dll 中出现“System.NotSupportedException”类型的异常,但未在用户代码中处理 附加信息:LINQ to Entities 不支持指定的类型成员“日期”。仅支持初始化器、实体成员和实体导航属性。

【问题讨论】:

  • 您可以尝试使用SqlFunctions.DatePart,但我不确定哪些 EF 版本支持它。
  • 你能给我一些示例代码吗?我已经用谷歌搜索了这个和很多我不能使用的例子,因为似乎大多数人没有使用实体,但我相信 Linq to Sql。
  • 请将您的答案作为答案发布,而不是对问题进行编辑。

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


【解决方案1】:

见下方更新

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


尝试以下方法。我稍微简化了一点,但如果你能验证它是否有效,你可以将它重新塑造成你正在尝试的完整的东西。此外,我很难对其进行测试,因为我首先要构建样本数据)。 here 是对正在发生的事情(LINQ to SQL 限制)的解释,而关于如何通过 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();

【讨论】:

  • SampleTime 属于 DateTime。我认为您的意思是 n.SampleTime.Hour?由于您提供的代码无法编译。
  • 看起来您在匿名对象中使用类型名称作为成员名称:new { Date = n.SampleTime.Date, Hour = n.SampleTime.Hour }。试试new { theDate = n.SampleTime.Date, theHour = n.SampleTime.Hour } 之类的方法,看看是否有帮助。当然,您可能还需要更改查询中其他地方的名称。
  • 我更新了我的答案,以便更深入地了解您现在遇到的问题以及可能的解决方案。
  • 查看我编辑的问题以获得最终答案,感谢 DWright 对其代码示例的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 2015-03-12
  • 1970-01-01
  • 2022-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多