Я должен найти самое близкое событие, со временем, в таблице. Если событие произошло 3 дня назад, а следующий будет завтра, я хочу второй. Viceversa, если событие произошло вчера, а следующее будет в следующем месяце, я хочу первый.
Поэтому я составляю свой запрос, основываясь на абсолютной разнице в секундах между датами, ограничивая 1 результат.
В псевдо SQL что-то вроде:
select * from events order by ABS(UNIXTIME(kickoff) - UNIXTIME(now)) limit 1
в LINQ:
Context.Events.OrderBy(m => Math.Abs( m.KickOff - DateTime.UtcNow ).TotalSeconds ).FirstAsync();
Он работает, но порядок составлен в памяти, а не в SQL "выражение LINQ" orderby Abs (([m].KickOff - DateTime.UtcNow).TotalSeconds) asc "не может быть переведено и будет оцениваться локально".
Как я могу получить заказ по запросу, выполненному в sql?
РЕДАКТИРОВАТЬ
Удаление абс
Context.Events.OrderBy(m => m.KickOff - DateTime.UtcNow ).FirstAsync();
работает, как я хочу
[...] ORDER BY 'm'.'kickoff' - UTC_TIMESTAMP()
но это не дает мне результата, который я ожидаю
Предполагая, что вы используете Entity Framework
и SQL Server
, вы можете использовать SqlFunctions.DateDiff
в System.Data.Entity.SqlServer
:
Context.Events.OrderBy(m => Math.Abs(SqlFunctions.DateDiff("ss", DateTime.UtcNow, m.KickOff)))
.FirstAsync();
Это предполагает, в now
в качестве даты начала и kick off
в качестве даты окончания. Вы можете поменять их, если вам нужно.