为什么DbFunction不能与Linq实体一起使用

时间:2016-04-26 18:04:04

标签: c# linq

var vals = (from r in result
                    group r by DbFunctions.TruncateTime(r.Created) into g
                    select new { count = g.Count(), date = g});

当我尝试运行以上内容时,我收到以下错误

Results是数据库查询的结果

  

"此功能只能从LINQ到实体调用。"

模型(result)返回Dates(以及其他内容),我尝试做的只是按日期(created)分组并计算它存在的次数。

Created已经是DateTime

我做错了什么?

1 个答案:

答案 0 :(得分:3)

DbFunctions类的目的是将表达式转换为正确的SQL语法:

  

提供公共语言运行时(CLR)方法,公开EDM规范函数以在DbContext或ObjectContext LINQ to Entities查询中使用。

由于您没有查询SQL源,因此没有理由使用DbFunctions方法。

等效的Linq-to-object查询将是:

var vals = (from r in result
            group r by r.Created.Date into g
            select new { v = g.Count(), d = g});
  

问题可能是Created为DateTime?

您可以使用条件运算符来解释它:

var vals = (from r in result
            group r by r.Created.HasValue ? (DateTime?)r.Created.Value.Date
                                          : (DateTime?)null 
                into g
            select new { v = g.Count(), d = g});

或只是

var vals = (from r in result
            group r by r.Created.Value.Date into g
            select new { v = g.Count(), d = g});

如果Created不可能为空(或者如果你想抛出异常)