【问题标题】:Not getting correct sequence of numbers没有得到正确的数字序列
【发布时间】:2018-07-26 08:24:49
【问题描述】:

我正在我们的一个使用 OFFSET x ROWS FETCH NEXT y ROWS ONLY 功能的 oracle sql 调用中编写分页功能,但我无法思考如何在不使用重复数字的情况下调用它。

目前我在 C# 端做这样的事情,_currOffsetx_nextOffsety

private int _currOffset = 0;
private int _maxFetchCount = 499;
private int _maxOffset = 2020;
private int _nextOffset = 0;

while(_currOffset < _maxOffset) {
    // If we are going to go over _maxOffset, just take the difference
    _nextOffset = (_currOffset + _maxFetchCount > _maxOffset) ? _maxOffset - _currOffset : _maxFetchCount;

    // Call Database using _currOffset and _nextOffset
    // .... OFFSET _currOffset ROWS FETCH NEXT _nextOffset ROWS ONLY

    _currOffset += _nextOffset + 1;
}

这对于两次迭代都可以正常工作,因为_currOffset 将是0_nextOffset 将是499_currOffset500_nextOffset 仍然是499第二次迭代。

对于第三次迭代,_currOffset 现在是501,这是错误。它应该保留为1 + &lt;the last offset I ended with&gt;

我基本上想在不重复偏移的情况下分块查询。

  1. 0查询到499

  2. 500查询到999

  3. 1000查询到1499

  4. 1500查询到1999

  5. 1999查询到2020(在这种情况下,if条件将_nextOffset设置为21

如何更改我的变量分配来处理这个问题?我不能只删除_currOffset += _nextOffset + 1,因为我会在我的sql 查询中两次查询相同的偏移量。 (第一次迭代我会以499 结尾,第二次迭代我会以499 开头,而第二次迭代我想以500 开头)

【问题讨论】:

  • 创建一个你期望代码做什么的心智模型。然后,开始调试。一步一步,逐行。在每一行执行之前,问问自己“我希望这行代码做什么?”。然后运行它。它这样做了吗?如果没有,那就是你的错误。
  • 您的 maxFetchCount 是 500,但您的第一个块 (0-500) 是 501 项。
  • @hatchet 你说得对,我想进入 500 的大块,而不是 0

标签: c# loops pagination


【解决方案1】:

可以进行一些更改,以使您获得所需的值:

  • 只要start 的值为&lt;= 最后一个项目索引,while 条件就会运行。
  • 当我们可以计算页面size 时,我们将1 添加到true 条件(当start + maxSize &gt; lastItem 时),以便将第一项包含在大小中(例如,5 - 14 ,但15的项目数实际上是5),所以size变成lastItem - start + 1
  • 当我们显示(或将变量设置为)最后一个项目索引时,它被计算为start + size - 1。例如,如果我们的大小为2,起始项为5,那么最后一项为6 (5 + 2 - 1)
  • 最后,我们只需在循环结束时将size 添加到我们的start

代码示例

private static void Main()
{
    var start = 0;
    var maxSize = 500;

    // Note that this represents the last item's *index*
    // There are actually 2021 total items, since the first item is at index '0'
    var lastItem = 2020;  

    while (start <= lastItem)
    {
        int size = start + maxSize > lastItem 
            ? lastItem - start + 1
            : maxSize;

        Console.WriteLine($"Query from {start} to {start + size - 1} ({size} items)");

        start += size;
    }

    GetKeyFromUser("\nDone! Press any key to exit...");
}

请注意,我重命名了您的变量,因此代码更加简洁。他们的地图如下:

  • _currOffset = start
  • _maxFetchCount = maxSize
  • _maxOffset = lastItem
  • _nextOffset = size

输出

【讨论】:

    猜你喜欢
    • 2013-08-06
    • 2010-10-15
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多