The list items we were running against had the following values:
ID Created
-- -------
51 8/30/2016 8:02:40 AM
49 8/12/2016 2:42:26 PM
48 6/27/2016 3:39:05 AM
46 6/21/2016 4:04:28 PM
45 6/21/2016 3:10:18 PM
44 6/21/2016 2:32:13 PM
43 6/21/2016 3:56:01 AM
42 6/20/2016 6:32:34 AM
41 6/20/2016 4:55:47 AM
39 6/14/2016 1:30:05 PM <-- The last item on page 1
38 6/14/2016 11:34:51 AM <-- Should be the first item on page 2
37 6/14/2016 10:21:22 AM <-- With our bad code, this one is first on page 2
36 6/14/2016 8:48:43 AM
35 6/9/2016 12:56:16 AM
32 5/25/2016 11:38:44 PM
29 5/9/2016 9:43:31 AM
28 5/9/2016 9:35:38 AM
26 4/28/2016 8:19:59 AM
Due to a bug in our code (timezone conversion!), we were providing an SPListItemCollectionPosition containing an incorrect value for the Created property. As a result, SPList.GetItems gets the first row that matches both criteria. This leads to the appearance that the paginated data is missing rows.
For example:
$webUrl = 'some-web-url';
$rowLimit = 10;
$goodPage = 'Paged=TRUE&p_ID=39&p_Created=20160614%2013%3A30%3A05';
$badPage = 'Paged=TRUE&p_ID=39&p_Created=20160614%2011%3A30%3A05';
$web = Get-SPWeb $webUrl;
$list = $web.Lists['some-list'];
$spquery = New-Object Microsoft.SharePoint.SPQuery;
$spquery.Query = "<OrderBy><FieldRef Name='Created' Ascending='False' /></OrderBy>";
$spquery.RowLimit = $rowLimit;
$spquery.ListItemCollectionPosition = New-Object Microsoft.SharePoint.SPListItemCollectionPosition($goodPage);
$list.GetItems($spquery) | Format-Table ID, Name, @{l='Created'; e={$_['Created']}} -AutoSize;
$spquery.ListItemCollectionPosition = New-Object Microsoft.SharePoint.SPListItemCollectionPosition($badPage);
$list.GetItems($spquery) | Format-Table ID, Name, @{l='Created'; e={$_['Created']}} -AutoSize;
$list.GetItems("Id", "Created", "Name") | Format-Table ID, Name, @{l='Created'; e={$_['Created']}} -AutoSize;
Using the above powershell, the results from $goodPage works as expected. However, with $badPage, the time is off by 2 hours (we provided 11:30:05 instead of 13:30:05). Since we are sorting descending by Created, the wrong page info value causes the entry at 11:34:51 to be skipped as well. Oops!