private/core/ConvertTo-QueryString.ps1

function ConvertTo-QueryString {
    <#
    .SYNOPSIS
        Convert Hashtable to Query String.

    .DESCRIPTION
        Convert Hashtable to Query String.

    .PARAMETER InputObjects
        Value to convert

    .PARAMETER EncodeParameterNames
        URL encode parameter names

    .EXAMPLE
        PS C:\>ConvertTo-QueryString @{ name = 'path/file.json'; index = 10 }

        Convert hashtable to query string.

    .EXAMPLE
        PS C:\>[ordered]@{ title = 'convert&prosper'; id = [guid]'352182e6-9ab0-4115-807b-c36c88029fa4' } | ConvertTo-QueryString

        Convert ordered dictionary to query string.

    .INPUTS
        System.Collections.Hashtable

    .LINK
        https://github.com/jasoth/Utility.PS
    #>

    [CmdletBinding()]
    [OutputType([string])]
    param (
        [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)]
        [object]
        $InputObjects,

        [switch]
        $EncodeParameterNames
    )

    process {
        foreach ($InputObject in $InputObjects) {
            $queryBuilder = [System.Text.StringBuilder]::new()
            if ($InputObject -is [System.Collections.IDictionary]) {
                foreach ($pair in $InputObject.GetEnumerator()) {
                    if ($queryBuilder.Length -gt 0) { [void]$queryBuilder.Append('&') }
                    $parameterName = $pair.Key
                    if ($EncodeParameterNames) { $parameterName = [System.Net.WebUtility]::UrlEncode($parameterName) }
                    [void]$queryBuilder.AppendFormat('{0}={1}', $parameterName, [System.Net.WebUtility]::UrlEncode($pair.Value))
                }
            }
            elseif ($InputObject -is [object] -and $InputObject -isnot [ValueType]) {
                foreach ($property in $InputObject.PSObject.Properties) {
                    if ($queryBuilder.Length -gt 0) { [void]$queryBuilder.Append('&') }
                    $parameterName = $property.Name
                    if ($EncodeParameterNames) { $parameterName = [System.Net.WebUtility]::UrlEncode($parameterName) }
                    [void]$queryBuilder.AppendFormat('{0}={1}', $parameterName, [System.Net.WebUtility]::UrlEncode($property.Value))
                }
            }
            else {
                ## Non-Terminating Error
                $exception = New-Object ArgumentException -ArgumentList ('Cannot convert input of type {0} to query string.' -f $InputObject.GetType())
                Write-Error -Exception $exception -Category ([System.Management.Automation.ErrorCategory]::ParserError) -CategoryActivity $MyInvocation.MyCommand -ErrorId 'ConvertQueryStringFailureTypeNotSupported' -TargetObject $InputObject
                continue
            }

            $queryBuilder.ToString()
        }
    }
}