src/_Internals/Add-XrmFilterConditionInternal.ps1
|
<# Add a condition to a FilterExpression (QueryExpression.Criteria or LinkEntity.LinkCriteria). - Values are normalized with ConvertTo-XrmSdkValueInternal (PSObject wrappers break serialization). - An empty In matches no row: an always-false sub-filter (Null AND NotNull) is added, so the query still runs and returns nothing, whatever the parent filter operator. - An empty NotIn matches every row: no condition is added. #> function Add-XrmFilterConditionInternal { param( [Parameter(Mandatory = $true)] [Microsoft.Xrm.Sdk.Query.FilterExpression] $Filter, [Parameter(Mandatory = $true)] [String] $Field, [Parameter(Mandatory = $true)] [Microsoft.Xrm.Sdk.Query.ConditionOperator] $Condition, [Parameter(Mandatory = $true)] [bool] $HasValues, [Parameter(Mandatory = $false)] [AllowNull()] [AllowEmptyCollection()] [System.Object[]] $Values, [Parameter(Mandatory = $false)] [bool] $CompareFieldValue = $false ) if (-not $HasValues) { $Filter.AddCondition($Field, $Condition); return; } if ($null -eq $Values) { $Filter.AddCondition($Field, $Condition, $Values); return; } if ($Values.Count -eq 0) { if ($Condition -eq [Microsoft.Xrm.Sdk.Query.ConditionOperator]::In) { $noRowFilter = $Filter.AddFilter([Microsoft.Xrm.Sdk.Query.LogicalOperator]::And); $noRowFilter.AddCondition($Field, [Microsoft.Xrm.Sdk.Query.ConditionOperator]::Null); $noRowFilter.AddCondition($Field, [Microsoft.Xrm.Sdk.Query.ConditionOperator]::NotNull); return; } if ($Condition -eq [Microsoft.Xrm.Sdk.Query.ConditionOperator]::NotIn) { return; } } $sdkValues = ConvertTo-XrmSdkValueInternal -Value $Values; $conditionValues = [object[]]::new($sdkValues.Length); [System.Array]::Copy($sdkValues, $conditionValues, $sdkValues.Length); if ($CompareFieldValue) { $Filter.AddCondition($Field, $Condition, $true, $conditionValues); } else { $Filter.AddCondition($Field, $Condition, $conditionValues); } } |