Skip to content

Support nullable (alternate) keys in ODataPathQueryBuilder #2888

Description

@Xriuk

Related: OData/odata.net#3415

Currently if I have a nullable property (like int?) used in an alternate key ODataPathQueryBuilder throws an exception when processing the generated KeySegment (with an int constant value):

System.InvalidOperationException: The binary operator Equal is not defined for the types 'System.Nullable`1[System.Int32]' and 'System.Int32'.
   at System.Linq.Expressions.Expression.GetEqualityComparisonOperator(ExpressionType binaryType, String opName, Expression left, Expression right, Boolean liftToNull)
   at System.Linq.Expressions.Expression.Equal(Expression left, Expression right, Boolean liftToNull, MethodInfo method)
   at ...\ODataPathQueryBuilder.cs:line 69
...

Replacing:

IEnumerable<BinaryExpression> conditions = keySegment.Keys.Select(kvp =>
Expression.Equal(
Expression.Property(filterParam, kvp.Key),
Expression.Constant(kvp.Value)));

With:

IEnumerable<BinaryExpression> conditions = keySegment.Keys.Select(kvp => {
	Expression prop = Expression.Property(filterParam, kvp.Key);
	Expression cons = Expression.Constant(kvp.Value);
	if (prop.Type != cons.Type)
		cons = Expression.Convert(cons, prop.Type);
	return Expression.Equal(prop, cons);
});

Seems to solve the issue

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions