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
相关产品推荐
相关产品推荐

