我有一张名为' 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不支持。仅支持初始化程序,实体成员和实体导航属性。
答案 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();