我收到一条错误,说明linq to entities在以下查询中不知道.Date
运算符:
var data = from p in page_loads
join f in sites
on p.site_id equals f.id
join tr in test_runs
on p.test_run_id equals tr.id
where f.id == 17
group p by p.created_at.Date into g
select new { time = g.Average(t => t.time), created_at = g.Key };
注意: created_at
在数据库中为NOT NULL
。我指出这一点是因为我知道created_at不可为空,而实体的linq会有问题。但我不知道如何解决这个问题。
修改
[EdmScalarProperty(EntityKeyProperty = false, IsNullable = false)]
[DataMember]
public DateTime created_at { get; set; }
答案 0 :(得分:4)
听起来你可能想要SqlFunctions.DatePart
:
group p by SqlFunctions.DatePart("day", p.created_at) into g
答案 1 :(得分:0)
您可以按DateTime
中的其他字段进行分组(为每年/月/日组合创建一个新的唯一匿名对象),并且您希望使用let
来简化查询:< / p>
var data = from p in x
join f in sites
on p.site_id equals f.id
join tr in test_runs
on p.test_run_id equals tr.id
where f.id == 17
let date = p.created_at
group p by new { y = date.Year, m = date.Month, d = date.Day} into g
select new { time = g.Average(t => t.time), created_at = g.Key };
如果您希望最终投影中的created_at
不是匿名类型,则可以通过将3个匿名值传递给{{{}}来将分组依据类型转换回DateTime
1}}构造函数。
answers to another SO question中提供了使用DateTime
的其他解决方案。