【问题标题】:Order by date diff in LINQ在 LINQ 中按日期差异排序
【发布时间】: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 很高兴我的猜测成功了

标签: c# linq .net-core


【解决方案1】:

假设你使用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 为结束日期。如果需要,您可以交换它们。

【讨论】:

  • 我正在使用 MySQL,但无论如何,查询不是我想要的:需要秒的绝对值。
  • @Longa 你应该可以将它包装在一个 Math.Abs​​ 中,Linq to SQL 默认支持大多数数学函数。例如:Math.Abs​​(SqlFunctions.DateDiff("ss", DateTime.UtcNow, m.KickOff))
  • @ReeseDeWind 我想过,但不确定。谢谢你的提示。更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多