C# 没有得到正确的数字序列
我正在一个oracle sql调用中编写分页功能,该调用使用了C# 没有得到正确的数字序列,c#,loops,pagination,C#,Loops,Pagination,我正在一个oracle sql调用中编写分页功能,该调用使用了OFFSET x ROWS FETCH NEXT y ROWS ONLY功能,我不知道如何在不使用重复数字的情况下调用它 目前我在C端做类似的事情,\u currooffset是x,\u nextofset是y private int _currOffset = 0; private int _maxFetchCount = 499; private int _maxOffset = 2020; private int _nextOf
OFFSET x ROWS FETCH NEXT y ROWS ONLY
功能,我不知道如何在不使用重复数字的情况下调用它
目前我在C端做类似的事情,\u currooffset
是x
,\u nextofset
是y
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;
}
private int\u currOffset=0;
私有int_maxFetchCount=499;
私有整数_maxOffset=2020;
私有int_nextofset=0;
而(\u currooffset<\u maxOffset){
//如果我们要检查_maxOffset,只需取差
_NEXTOFSET=(\u currOffset+\u maxFetchCount>\u maxOffset)?\u maxOffset-\u currOffset:\u maxFetchCount;
//使用_currOffset和_nextofset调用数据库
//..偏移量\u currOffset行仅获取下一个\u nextofset行
_currOffset+=\u nextofset+1;
}
这在两次迭代中都很有效,因为第一次\u currooffset
将0
,\u nextofset
将499
,\u currooffset
是500
,\u nextofset
仍然是499
第二次迭代
对于第三次迭代,currOffset现在是501
,这是错误的。它应该保持1+
我基本上希望在不重复偏移量的情况下分块查询
0
查询到499
500
查询到999
1000
查询到1499
1500
查询到1999
1999
查询到2020
(在这种情况下,if条件将\u nextofset
设置为21
)如何更改变量的赋值以处理此问题?我不能只删除
\u curroOffset+=\u nextofset+1
,因为我会在sql查询中查询同一个偏移量两次。(第一次迭代以499
结束,第二次迭代以499
开始,当我想第二次迭代以500
开始时)可以改变一些事情,让你得到你想要的值:
- 只要
值为start
,lastItem
条件运行,以便在大小中包含第一个项目(例如,while
为5-1
,但从4
到1
的项目数实际上为5
),因此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...");
}
private static void Main()
{
var start=0;
var maxSize=500;
//请注意,这表示最后一项的*索引*
//实际上总共有2021个项目,因为第一个项目位于索引“0”处
var lastItem=2020;
while(启动最后一项)
?最后一项-开始+1
:最大尺寸;
WriteLine($“从{start}查询到{start+size-1}({size}项)”);
开始+=大小;
}
GetKeyFromUser(“\n完成!按任意键退出…”);
}
请注意,我重命名了您的变量,因此代码更加精简。它们的映射如下:
\u currooffset=start
\u maxFetchCount=maxSize
\u maxOffset=lastItem
\u nextofset=size
输出
创建一个你期望代码做什么的心智模型。然后,开始调试。逐行逐行进行。在每行执行之前,问问自己“我期望这行代码做什么?”然后运行它。它做到了吗?如果没有,那就是你的错误。你的maxFetchCount是500,但你的第一个块(0-500)是501项。@hatchet你说得对,我想分块去
500
,而不是0
。