Linq到实体不知道.Date运算符是什么

时间:2012-06-20 19:00:32

标签: c# mysql linq linq-to-sql linq-to-entities

我收到一条错误,说明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; }

2 个答案:

答案 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的其他解决方案。