Skip to content

[Bug] ParseException: Operator '==' incompatible with operand types 'ObjectId' and 'ObjectId' #94

@aveyrier

Description

@aveyrier

When using this library with the MongoDB.Driver package, an error occurs with the DynamicExpressionParser.ParseLambda method while trying to compare an object containing an ObjectId property with another ObjectId object.

This kind of comparison works fine inside a classic lambda expression (e.g. entity => entity.Id == ObjectId.Parse(id)) but it throws with the dynamic equivalent (e.g. "it.Id == @0"). Other operators doesn't work neither (>, <, >=, <=, !=) even though they are defined in the struct, but the Equals method works fine.

Code

private async Task<Todo> GetTodo(string id)
{
    ParameterExpression[] parameters = new[]
    {
        Expression.Parameter(typeof(Todo), "it"),
    };

    LambdaExpression find = DynamicExpressionParser.ParseLambda(parameters, typeof(bool), "it.Id == @0", ObjectId.Parse(id));

    return await _db.GetCollection<Todo>("Todos")
        .Find((Expression<Func<Todo, bool>>)find)
        .Limit(1)
        .SingleOrDefaultAsync();
}

Error

ParseException: Operator '==' incompatible with operand types 'ObjectId' and 'ObjectId'

Stacktrace

System.Linq.Dynamic.Core.ExpressionParser.CheckAndPromoteOperands(Type signatures, string opName, ref Expression left, ref Expression right, int errorPos)
System.Linq.Dynamic.Core.ExpressionParser.ParseComparisonOperator()
System.Linq.Dynamic.Core.ExpressionParser.ParseLogicalAndOrOperator()
System.Linq.Dynamic.Core.ExpressionParser.ParseIn()
System.Linq.Dynamic.Core.ExpressionParser.ParseAndOperator()
System.Linq.Dynamic.Core.ExpressionParser.ParseOrOperator()
System.Linq.Dynamic.Core.ExpressionParser.ParseLambdaOperator()
System.Linq.Dynamic.Core.ExpressionParser.ParseNullCoalescingOperator()
System.Linq.Dynamic.Core.ExpressionParser.ParseConditionalOperator()
System.Linq.Dynamic.Core.ExpressionParser.Parse(Type resultType, bool createParameterCtor)
System.Linq.Dynamic.Core.DynamicExpressionParser.ParseLambda(bool createParameterCtor, ParameterExpression[] parameters, Type resultType, string expression, Object[] values)
System.Linq.Dynamic.Core.DynamicExpressionParser.ParseLambda(ParameterExpression[] parameters, Type resultType, string expression, Object[] values)
TodoList.Controllers.TodosController+<GetEntity>d__4.MoveNext() in TodosController.cs
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
System.Runtime.CompilerServices.TaskAwaiter.GetResult()
TodoList.Controllers.TodosController+<Get>d__3.MoveNext() in TodosController.cs
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker+<InvokeActionMethodAsync>d__27.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker+<InvokeNextActionFilterAsync>d__25.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker+<InvokeNextResourceFilter>d__22.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ResourceExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker+<InvokeAsync>d__20.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
Microsoft.AspNetCore.Builder.RouterMiddleware+<Invoke>d__4.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware+<Invoke>d__7.MoveNext()

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions