-
-
Notifications
You must be signed in to change notification settings - Fork 244
Closed
Labels
Description
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()
Reactions are currently unavailable