postgresql postgres中基于键集的分页的LINQ等价物

mpgws1up  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(2)|浏览(113)

我有一个postgresql查询,它使用基于键集的方法进行分页。

SELECT *
FROM public.values_with_variable_view
WHERE ( timestamp, id) > ('2024-01-04 01:12:09.267335+00',1996)
ORDER BY ( timestamp, id) asc
LIMIT 100

字符串
我需要在c#中使用LINQ来写这个代码,我试着在.Where(x=>x.timestamp > '2024-01-04 01:12:09.267335+00' && x.id > 1996)中使用where子句,但它给出了不同的结果。
这里是DBFiddle

vql8enpb

vql8enpb1#

您应该添加||部分:

var query = context.values_with_variable_view
    .Where(x => x.timestamp > '2023-11-30 09:32:19.776586' 
        || x.timestamp == '2023-11-30 09:32:19.776586' && x.id > 1)
    .OrderBy(x => x.timestamp)
    .ThenBy(x => x.Id)
    .Take(100);

字符串

31moq8wy

31moq8wy2#

我建议使用.Where(x => x.timestamp >= last.timestamp && (x.timestamp > last.timestamp || x.id > last.id)),这样可能会有更好的性能。在前面使用x.timestamp >= last.timestamp条件,而不使用替代的 * 或 * 条件,应该会提高索引的使用率。条件的第二部分会在初始索引查找后优化筛选器。
再结合斯维亚托斯拉夫·丹尼利夫帖子里的代码,答案应该是:

var query = context.values_with_variable_view
    .Where(x =>
        x.timestamp >= last.timestamp                       // Index seek part
        && (x.timestamp > last.timestamp || x.id > last.id) // Filter part
    )
    .OrderBy(x => x.timestamp)
    .ThenBy(x => x.Id)
    .Take(100);

字符串
请参阅this updated fiddle
注意,我已经在测试表上为(timestamp, id)添加了一个索引。
要真实的确定哪一个是最好的,应该对实时数据(可能远远大于25行)尝试两种选择,并检查执行计划的性能。

相关问题