src/_Internals/Invoke-XrmQueryPagesInternal.ps1
|
<# Run a query (QueryExpression or QueryByAttribute) page by page and pass each page (EntityCollection) to OnPage. Paging is enabled when the query has no TopCount. The query PageInfo is overwritten, as Get-XrmMultipleRecords always did. A failed page stops the loop (the error is written as before, with what was read so far). OnPage runs in a child scope: accumulate into a reference type (list, hashset, hashtable). #> function Invoke-XrmQueryPagesInternal { param( [Parameter(Mandatory = $true)] [Microsoft.PowerPlatform.Dataverse.Client.ServiceClient] $XrmClient, [Parameter(Mandatory = $true)] [Microsoft.Xrm.Sdk.Query.QueryBase] $Query, [Parameter(Mandatory = $false)] [int] $PageSize = 1000, [Parameter(Mandatory = $false)] [switch] $ShowProgress, [Parameter(Mandatory = $true)] [scriptblock] $OnPage ) $enablePaging = ($null -eq $Query.TopCount); $pageNumber = 1; if ($enablePaging) { $Query.PageInfo = [Microsoft.Xrm.Sdk.Query.PagingInfo]::new(); $Query.PageInfo.PageNumber = $pageNumber; $Query.PageInfo.Count = $PageSize; $Query.PageInfo.PagingCookie = $null; } while ($true) { $results = Protect-XrmCommand -ScriptBlock { $XrmClient.RetrieveMultiple($Query) }; if ($null -eq $results) { break; } if ($enablePaging -and $ShowProgress) { Write-Progress -Activity "Retrieving data from Microsoft Dataverse" -Status "Processing record page : $pageNumber" -PercentComplete -1 -Id 1050; } & $OnPage $results; if ($enablePaging -and $results.MoreRecords) { $pageNumber++; $Query.PageInfo.PageNumber = $pageNumber; $Query.PageInfo.PagingCookie = $results.PagingCookie; } else { break; } } if ($enablePaging -and $ShowProgress) { Write-Progress -Activity "Retrieving data from Microsoft Dataverse" -Id 1050 -Completed; } } |