在LINQ中按日期差异排序

时间:2018-10-19 10:22:53

标签: c# linq .net-core

我必须在表中及时找到最接近的事件。 如果三天前发生了一个事件,而下一个事件将在明天发生,那么我要第二个事件。反之,如果昨天发生了一个事件,下一个事件将在下个月发生,我想要第一个事件。

因此,我根据日期之间以秒为单位的绝对差(不超过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();

可以,但是order by是在内存中而不是在SQL中组成的。 LINQ表达式'orderby Abs(([[m] .KickOff-DateTime.UtcNow).TotalSeconds)asc'无法翻译,将在本地进行评估。

如何在sql中通过查询执行订单?

编辑

删除Abs

Context.Events.OrderBy(m => m.KickOff - DateTime.UtcNow ).FirstAsync();

根据需要工作

[...] ORDER BY `m`.`kickoff` - UTC_TIMESTAMP() 

但是它没有给我我期望的结果

1 个答案:

答案 0 :(得分:0)

假设您正在使用Entity FrameworkSQL Server,则可以在SqlFunctions.DateDiff中使用System.Data.Entity.SqlServer

Context.Events.OrderBy(m => Math.Abs(SqlFunctions.DateDiff("ss", DateTime.UtcNow, m.KickOff)))
              .FirstAsync();

这假设now为开始日期,kick off为结束日期。您可以根据需要交换它们。