没有得到正确的数字顺序

时间:2018-07-25 21:35:31

标签: c# loops pagination

我正在使用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,并且第一次是_currOffset是{{ 1}}和500仍然是第二次迭代的_nextOffset

对于第三次迭代,499现在为_currOffset,这是错误。它应该保留为501

我基本上想查询大块而不重复偏移量。

  1. 1 + <the last offset I ended with>查询到0

  2. 499查询到500

  3. 999查询到1000

  4. 1499查询到1500

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

如何更改变量分配以处理此问题?我不能只删除21,因为我会在sql查询中两次查询相同的偏移量。 (当我想从_currOffset += _nextOffset + 1开始进行第二次迭代时,我将以499结束第一次迭代,而以499进行第二次迭代)

1 个答案:

答案 0 :(得分:0)

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

  • 只要while的值是最后一项索引的start,就运行<=条件。
  • 当我们可以计算页面size时,我们将1添加到true条件中(当start + maxSize > lastItem时),以便将第一个项目包括在尺寸中(例如,5 - 14,但是从15的项数实际上是5),所以size变成了{{1} }。
  • 当我们显示(或设置一个变量)最后一个项目索引时,它的计算方式为lastItem - start + 1。例如,如果我们的大小为start + size - 1,起始项目为2,则最后一项为56 + 5-{{ 1}})
  • 最后,我们只需在循环结束时将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

输出

enter image description here