【问题标题】:Entity Framework 6 - DbFunctions.AddHours error实体框架 6 - DbFunctions.AddHours 错误
【发布时间】:2017-05-28 14:36:47
【问题描述】:

我的任务是在特定时间段内获取一组实体。 我正在使用代码优先方法和 MySql 服务器。

用代码

IQueryable<Entity> query = dbContext.Set<Entity>().AsNoTracking();

Entity[] entities = (from e in query
               let last = (from ee in query orderby ee.Id descending select ee).FirstOrDefault()
               where e.Timestamp >= DbFunctions.AddHours(last.Timestamp, -hours)
               select e).ToArray();

以及以下由 EF 6.1.3 生成的 SQL

SELECT
`Extent1`.`Id`, 
`Extent1`.`Timestamp`
FROM `Entities` AS `Extent1` LEFT OUTER JOIN (SELECT
`Extent2`.`Id`, 
`Extent2`.`Timestamp`
FROM `Entities` AS `Extent2`
 ORDER BY 
`Extent2`.`Id` DESC LIMIT 1) AS `Limit1` ON 1 = 1
 WHERE `Extent1`.`Timestamp` >= (AddHours(`Limit1`.`Timestamp`, -(@p__linq__0)))

我遇到了一个错误

Failed in 6 ms with error: FUNCTION mydb.AddHours does not exist

事实上,我在 DB 端没有这个功能。 有人知道DbFunctions 是如何工作的吗?

UPD

类似的问题

EntityFramework 6.1.3 and MySQL DbFunctions.TruncateTime does not exist?

how to use canonical functions in Entity Framework and Mysql

【问题讨论】:

    标签: mysql entity-framework linq-to-entities


    【解决方案1】:

    您正在尝试调用数据库的存储函数,但该函数不存在。解决方案是正确创建AddHours db 函数。更多信息可以在here找到。

    【讨论】:

    • 这就是我实际所做的,但为什么没有人说我应该在将它与 DbFunctions 一起使用之前手动创建该函数?我假设它是在 EF 生成 SQL 查询时动态创建的。
    • @JohnSmith 它不是由 EF 创建的。这将涉及代码弄清楚你的意图是什么。目前这是不可能的,因此您的运行时异常。 EF 加载基于您现有实体生成的对象,您的查询不会生成它们。
    【解决方案2】:

    目前的解决方法 - 刚刚在 DbInitializer 中添加了该函数的实现

    CREATE FUNCTION AddHours(timeValue datetime, addValue int) RETURNS datetime
            RETURN DATE_ADD(timeValue, INTERVAL addValue HOUR);
    

    【讨论】:

      猜你喜欢
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      相关资源
      最近更新 更多