我正在尝试平均与相同日期关联的数据,并且我尝试使用linq从datetime中提取日期。我可以在mysql工作台中执行此操作并获得我想要的结果:
select avg(pl.time), Date(pl.created_at) as date
from page_loads as pl
join sites as s
on pl.site_id = s.id
join test_runs as t
on pl.test_run_id = t.id
where s.3id = 17
group by date
我如何在linq中执行此操作。到目前为止我有这个:
var data = from pl in page_loads
join s in sites
on pl.site_id equals s.id
join t in test_runs
on pl.test_run_id equals t.id
where s.3id == 17
select new { time = pl.time, created_at = pl.created_at };
这给了我以下结果:
4034 2012-06-06 00:15:48
5649 2012-06-06 00:31:05
4275 2012-06-06 01:48:54
4352 2012-06-07 06:50:27
5672 2012-06-07 07:05:15
7510 2012-06-07 17:49:25
10366 2012-06-07 17:49:53
12193 2012-06-07 18:32:28
3681 2012-06-07 18:55:42
7951 2012-06-07 18:59:59
2273 2012-06-07 19:26:38
6816 2012-06-08 22:41:48
6918 2012-06-08 22:44:40
3702 2012-06-08 23:03:58
3065 2012-06-08 23:04:58
5981 2012-06-19 20:46:40
1695 2012-06-19 20:48:36
4323 2012-06-19 20:50:24
但我想平均与同一日期关联的数字,我想从日期时间戳中提取日期。
答案 0 :(得分:1)
您要做的是根据日期分组获得平均值,但您编写的LINQ不包含组子句。一个开始的好地方是查看LINQ示例。这个LINQ Aggregate Operators将为您提供一个可以使用的示例。
答案 1 :(得分:0)
任何DateTime上的Date属性都会为您提供该日期的DateTime
即:(new DateTime(2001,1,1,13,1,1)).Date
应该等于new DateTime(2001,1,1)
对于内存中对象
,这样的事情应该起作用var data = from pl in page_loads
join s in sites
on pl.site_id equals s.id
join t in test_runs
on pl.test_run_id equals t.id
where s.3id == 17
group pl by pl.created_at.Date into g
select new { time = g.Average(t=>t.time), created_at = g.Key };
编辑:Stack Overflow问题LINQ to Entities group-by failure using .date有一个已接受的答案,详细说明了如何使用适用于Entity Framework / LINQ to SQL的方法。
您需要将组行修改为:
group pl by EntityFunctions.TruncateTime(pl.created_at) into g
但除此之外,解决方案的其余部分保持不变。