【发布时间】:2019-03-24 05:37:00
【问题描述】:
我必须在表格中及时找到最近的事件。 如果一个事件发生在 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 中执行 order by 查询?
编辑
去除腹肌
Context.Events.OrderBy(m => m.KickOff - DateTime.UtcNow ).FirstAsync();
按我的意愿工作
[...] ORDER BY `m`.`kickoff` - UTC_TIMESTAMP()
但它没有给我预期的结果
【问题讨论】:
-
您使用的是 .NET 核心吗?
-
是的,.NET core 中的 c#,我会更改标签
-
只是猜测,这可行吗:
.OrderBy(m => m.KickOff < DateTime.UtcNow ? DateTime.UtcNow - m.KickOff : m.KickOff - DateTime.Now)?基本上:分别处理过去和未来的启动 -
@Hans Kesting,干得好!!它可以通过 CASE 编写订单。谢谢
-
@Longa 很高兴我的猜测成功了