我必须及时在表中找到最近的事件。 如果 3 天前发生了一件事,而下一个是明天,我想要第二个。反之亦然,如果昨天发生了一个事件,而下一个事件将在下个月发生,我想要第一个。
所以我根据日期之间以秒为单位的绝对差异来编写查询,限制为 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 中执行查询订单?
编辑
去除腹肌
Context.Events.OrderBy(m => m.KickOff - DateTime.UtcNow ).FirstAsync();
如我所愿
[...] ORDER BY `m`.`kickoff` - UTC_TIMESTAMP()
但它没有给我预期的结果
最佳答案
假设您正在使用 Entity Framework
和 SQL Server
,您可以在 System.Data.Entity 中使用
:SqlFunctions.DateDiff
.SqlServer
Context.Events.OrderBy(m => Math.Abs(SqlFunctions.DateDiff("ss", DateTime.UtcNow, m.KickOff)))
.FirstAsync();
这假定 now
为开始日期,kick off
为结束日期。如果需要,您可以交换它们。
关于c# - LINQ 中按日期差异排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52890473/