【问题标题】:Why does DbFunctions not work with Linq to Entities为什么 DbFunctions 不能与 Linq to Entities 一起使用
【发布时间】:2016-04-26 18:04:04
【问题描述】:
var vals = (from r in result
                    group r by DbFunctions.TruncateTime(r.Created) into g
                    select new { count = g.Count(), date = g});

当我尝试运行上述程序时,我收到以下错误

Results 是数据库查询的结果

"此函数只能从 LINQ to Entities 调用。"

模型 (result) 返回日期(除其他外),我要做的只是按日期分组 (created) 并计算出它存在的次数。

Created 已经是日期时间

我做错了什么?

【问题讨论】:

  • @spender,我已经按照帖子的建议去做了。我还收到了与该帖子不同的错误消息,所以问题不同
  • @spender 那篇文章谈论的是在不同版本的 EF 中使用 DbFunctions。这个问题是关于在 Linq-to-objects 中使用 DbFunctions 的问题,这是不可能的。
  • 是的。我正要重新开张,但你抢先了。向你们俩道歉。
  • @spender,感谢您阅读我们的反馈并采取行动。很高兴知道系统可以正常工作,并且模组非常适合阅读、审查和采取适当的行动
  • 您实际上是在使用 Linq to Entities(即实体框架)还是在使用 Linq to Objects(即 IEnumerables)?

标签: c# linq


【解决方案1】:

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

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

由于您不是在查询 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 不可能为空(或者如果你想抛出异常)

【讨论】:

  • TruncateTime 函数生成删除DATETIME 表达式的时间部分的SQL。 DateTimeDate 属性对 .NET DateTime 值执行相同的操作。
  • 当我尝试这个时,它不会编译。问题可能是 Created 是 DateTime? (接受空值)
  • 正确的..因为它可以为空,我需要添加.Value(因为我知道它是为此查询填充的)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 2010-09-21
相关资源
最近更新 更多