使用linq从datetime关联的相同日期和提取日期的平均数

时间:2012-06-20 04:14:14

标签: c# linq linq-to-sql

我正在尝试平均与相同日期关联的数据,并且我尝试使用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

但我想平均与同一日期关联的数字,我想从日期时间戳中提取日期。

2 个答案:

答案 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 

但除此之外,解决方案的其余部分保持不变。