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

PostgreSQL键集分页的C# LINQ等效实现及结果不符求助

PostgreSQL键集分页的LINQ正确实现

原PostgreSQL查询使用的是元组比较逻辑,等价于:

只要记录的timestamp大于给定值,就符合条件;如果timestamp等于给定值,则只有id大于给定值的记录才符合条件。

你之前用Where(x=>x.timestamp > '2024-01-04 01:12:09.267335+00' && x.id > 1996)的写法,是要求timestamp和id同时大于给定值,这和原SQL的逻辑完全不符,所以结果不一致。

正确的LINQ实现方式

方法1:使用元组比较(EF Core 3.0+ 及 Npgsql EF Core 支持)

直接构造元组进行比较,EF Core会自动翻译为PostgreSQL的元组比较语法:

var lastTimestamp = DateTimeOffset.Parse("2024-01-04 01:12:09.267335+00");
var lastId = 1996;

var pageQuery = dbContext.ValuesWithVariableView
    .Where(x => (x.Timestamp, x.Id) > (lastTimestamp, lastId))
    .OrderBy(x => x.Timestamp)
    .ThenBy(x => x.Id)
    .Take(100);

方法2:手动写等价逻辑(兼容旧版本EF)

如果你的EF版本不支持元组翻译,可以手动实现元组比较的等价逻辑:

var lastTimestamp = DateTimeOffset.Parse("2024-01-04 01:12:09.267335+00");
var lastId = 1996;

var pageQuery = dbContext.ValuesWithVariableView
    .Where(x => x.Timestamp > lastTimestamp || (x.Timestamp == lastTimestamp && x.Id > lastId))
    .OrderBy(x => x.Timestamp)
    .ThenBy(x => x.Id)
    .Take(100);

以上两种写法都会生成和原PostgreSQL查询逻辑一致的SQL,确保分页结果与原查询匹配。

内容的提问来源于stack exchange,提问作者Amit Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:15:16