У меня есть задача получить набор объектов в течение определенного периода времени. Я использую первый подход кода и сервер MySql.Entity Framework 6 - DbFunctions.AddHours error
С кодом
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();
И следующий SQL генерируемой EF 6.1.3
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
И действительно, я не получил, что на стороне БД. Кто-нибудь знает, как работают эти DbFunctions
?
UPD
Похожие вопросы
EntityFramework 6.1.3 and MySQL DbFunctions.TruncateTime does not exist?
how to use canonical functions in Entity Framework and Mysql
Это то, что я на самом деле сделал, но почему ничего не сказано о том, что я должен был создать функцию вручную, прежде чем использовать ее с помощью DbFunctions? Я предположил, что он создается на лету, а EF генерирует SQL-запрос. –
@JohnSmith не создается EF. Это будет включать в себя код, определяющий, каково ваше намерение. В этот момент это невозможно, поэтому исключение из среды выполнения. EF загружает объекты, созданные на основе существующих сущностей, и ваш запрос не будет генерировать их. –