diff --git a/src/JsonApiDotNetCore/Queries/Parsing/ConstantValueConverter.cs b/src/JsonApiDotNetCore/Queries/Parsing/ConstantValueConverter.cs
new file mode 100644
index 0000000000..d624964ddd
--- /dev/null
+++ b/src/JsonApiDotNetCore/Queries/Parsing/ConstantValueConverter.cs
@@ -0,0 +1,15 @@
+namespace JsonApiDotNetCore.Queries.Parsing;
+
+///
+/// Converts a constant value within a query string parameter to an .
+///
+///
+/// The constant value to convert from.
+///
+///
+/// The zero-based position of in the query string parameter value.
+///
+///
+/// The converted object instance.
+///
+public delegate object ConstantValueConverter(string value, int position);
diff --git a/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs b/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs
index cbd6ee4b21..19757bbd08 100644
--- a/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs
+++ b/src/JsonApiDotNetCore/Queries/Parsing/FilterParser.cs
@@ -252,13 +252,13 @@ private QueryExpression ParseComparisonRightTerm(QueryExpression leftTerm)
var leftAttribute = (AttrAttribute)leftLastField;
- Func constantValueConverter = GetConstantValueConverterForAttribute(leftAttribute);
+ ConstantValueConverter constantValueConverter = GetConstantValueConverterForAttribute(leftAttribute);
return ParseTypedComparisonRightTerm(leftAttribute.Property.PropertyType, constantValueConverter);
}
if (leftTerm is FunctionExpression leftFunction)
{
- Func constantValueConverter = GetConstantValueConverterForType(leftFunction.ReturnType);
+ ConstantValueConverter constantValueConverter = GetConstantValueConverterForType(leftFunction.ReturnType);
return ParseTypedComparisonRightTerm(leftFunction.ReturnType, constantValueConverter);
}
@@ -266,7 +266,7 @@ private QueryExpression ParseComparisonRightTerm(QueryExpression leftTerm)
$"Internal error: Expected left term to be a function or field chain, instead of '{leftTerm.GetType().Name}': '{leftTerm}'.");
}
- private QueryExpression ParseTypedComparisonRightTerm(Type leftType, Func constantValueConverter)
+ private QueryExpression ParseTypedComparisonRightTerm(Type leftType, ConstantValueConverter constantValueConverter)
{
bool allowNull = RuntimeTypeConverter.CanContainNull(leftType);
@@ -329,7 +329,7 @@ protected virtual MatchTextExpression ParseTextMatch(string operatorName)
EatSingleCharacterToken(TokenKind.Comma);
- Func constantValueConverter = GetConstantValueConverterForAttribute(targetAttribute);
+ ConstantValueConverter constantValueConverter = GetConstantValueConverterForAttribute(targetAttribute);
LiteralConstantExpression constant = ParseConstant(constantValueConverter);
EatSingleCharacterToken(TokenKind.CloseParen);
@@ -352,7 +352,7 @@ protected virtual AnyExpression ParseAny()
ImmutableHashSet.Builder constantsBuilder = ImmutableHashSet.CreateBuilder();
- Func constantValueConverter = GetConstantValueConverterForAttribute(targetAttribute);
+ ConstantValueConverter constantValueConverter = GetConstantValueConverterForAttribute(targetAttribute);
LiteralConstantExpression constant = ParseConstant(constantValueConverter);
constantsBuilder.Add(constant);
@@ -489,7 +489,7 @@ private static ResourceType ResolveDerivedType(ResourceType baseType, string der
return filter;
}
- private LiteralConstantExpression ParseConstant(Func constantValueConverter)
+ private LiteralConstantExpression ParseConstant(ConstantValueConverter constantValueConverter)
{
int position = GetNextTokenPositionOrEnd();
@@ -514,7 +514,7 @@ private NullConstantExpression ParseNull()
throw new QueryParseException("null expected.", position);
}
- private static Func GetConstantValueConverterForType(Type destinationType)
+ protected virtual ConstantValueConverter GetConstantValueConverterForType(Type destinationType)
{
return (stringValue, position) =>
{
@@ -529,7 +529,7 @@ private static Func GetConstantValueConverterForType(Type d
};
}
- private Func GetConstantValueConverterForAttribute(AttrAttribute attribute)
+ private ConstantValueConverter GetConstantValueConverterForAttribute(AttrAttribute attribute)
{
if (attribute is { Property.Name: nameof(Identifiable