You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何更高效使用Linq Last()获取Postgres时序库中设备最新位置?

获取搭载TimeScale的Postgres设备最新位置的高效LINQ方案

我有一个搭载TimeScale的大型Postgres设备数据表,需要获取设备的最新位置。已知最高效的方案是通过TimeScale每日持续聚合并保存最新位置,但本次暂不讨论该方案。

我使用LINQ执行SQL查询,针对60台设备测试了三种获取设备最新位置的方法,各方法表现如下:

  • LINQ的Last()方法:耗时132秒,需占用大量内存。原因是Last()无法被LINQ转换为SQL,会在客户端计算,导致数据库与程序间产生大量数据传输。
    代码:

    gpsPositionDto.Latitude = _context.MeasureValues.Last(c => c.MachineId == machine && c.MeasureValueId == 80).Value;
    
  • LINQ的OrderByDescending().First()方法:耗时114秒,计算在数据库端完成,无大量数据传输,但数据库需占用较多内存。
    代码:

    gpsPositionDto.Latitude = _context.MeasureValues.OrderByDescending(c => c.Timestamp).First(c => c.MachineId == machine && c.MeasureValueId == 80).Value;
    
  • LINQ的First()方法:耗时30秒,但无法得到正确结果,仅用于测试耗时参考。
    代码:

    gpsPositionDto.Latitude = _context.MeasureValues.First(c => c.MachineId == machine && c.MeasureValueId == 80).Value;
    

我希望找到耗时与First()相近但能获取正确数据的方法,该函数每小时需执行一次,且后续设备数量还会持续增加。

内容的提问来源于stack exchange,提问作者Rafael Eberle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 04:15:21