c# - LINQ 中按日期差异排序

标签 c# linq .net-core

我必须及时在表中找到最近的事件。 如果 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 FrameworkSQL 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/

相关文章:

c# - 有条件地从列表中获取总和

c# - 大型数据集上的 System.Numerics.Vector<T>

c# - 是否可以实现自定义安全转换(在任意抽象数据结构之间使用 "as")?

.net - NuGet Packager Task 在 VSTS 中使用错误的 MSBuild?

c# - 此 DDD 应用程序中有哪些聚合?

c# - 图像 split 成 9 block

c# - 为什么 Func<> 和 Expression<Func<>> 可以互换?为什么一个对我有用?

c# - 如何更改图表控件中各个列的颜色?

c# - 如何使用c#计算文件系统中一个文件夹中相似名称文件的数量?

linq - Linq 中具有 2 个以上数据表的内连接