Сортировка по дате в LINQ

2

Я должен найти самое близкое событие, со временем, в таблице. Если событие произошло 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() 

но это не дает мне результата, который я ожидаю

  • 0
    Вы используете ядро .NET?
  • 0
    Да, c # в ядре .NET, я буду менять теги
Показать ещё 3 комментария
Теги:
linq
.net-core

1 ответ

0

Предполагая, что вы используете 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 в качестве даты окончания. Вы можете поменять их, если вам нужно.

  • 0
    Я использую MySQL, но в любом случае запрос не тот, который я хочу: необходимо абсолютное значение для секунд.
  • 0
    @Longa, вы должны иметь возможность обернуть его в Math.Abs, большинство функций Math поддерживаются Linq to SQL по умолчанию. например: Math.Abs (SqlFunctions.DateDiff ("ss", DateTime.UtcNow, m.KickOff))
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню