System.ArgumentException: número incorrecto de parámetros suministrados para la declaración lambda en el método System.Linq.Expressions

.net c# expression-trees linq linq-to-sql

Pregunta

Compañeros, estoy tratando de construir un árbol de expresiones usando System.Linq.Expressions y estoy recibiendo este error:

Erro: System.ArgumentException: Número incorrecto de parámetros suministrados para la declaración lambda en System.Linq.Expressions.Expression.ValidateLambdaArgs (Type delegateType, Expression & body, ReadOnlyCollection 1 parameters) at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, String name, Boolean tailCall, IEnumerable 1 parámetros) en System.Linq.Expressions.Expression.Lambda [TDelegate] (Expresión del cuerpo, Boolean tailCall, IEnumerable`1 parámetros) en System.Linq.Expressions.Expression.Lambda [TDelegate] (Cuerpo de la expresión, ParameterExpression [] parámetros) en Gedi.Controllers.OperacaoController.opBuscaFile (formulario FormCollection) en c: \ Users \ Guilherme \ Documents \ Visual Studio 2012 \ Projects \ Gedi \ Gedi \ Controllers \ OperacaoController.cs: línea 338

El código:

IQueryable<String> queryableData = AllIndexValues.AsQueryable<string>();


//docTypeId == idTipo
ParameterExpression pe1 = Expression.Parameter(typeof(int), "docTypeId");
Expression right = Expression.Constant(idTipo);
Expression e1 = Expression.Equal(pe1, right);


//idIndice == 16
ParameterExpression pe2 = Expression.Parameter(typeof(int), "idIndice");
right = Expression.Constant(16, typeof(int));
Expression e2 = Expression.Equal(pe2, right);

//docTypeId == idTipo AND idIndice == 16
Expression predicateBody = Expression.And(e1,e2);

//queryableData.Where(docTypeId => (docTypeId ==  idTipo) AND idIndice => (idIndice ==  16)) 
MethodCallExpression whereCallExpression = Expression.Call(typeof(Queryable), "Where", new Type[] { queryableData.ElementType }, queryableData.Expression, Expression.Lambda<Func<string, bool>>(predicateBody, new ParameterExpression[] { pe1, pe2 }));

IQueryable<string> results = queryableData.Provider.CreateQuery<string (whereCallExpression);

return Content(""+results);

He adaptado este código desde aquí http://msdn.microsoft.com/en-us/library/vstudio/bb882637.aspx

Gracias

Respuesta aceptada

Este es el problema inicial, creo:

Expression.Lambda<Func<string, bool>>(predicateBody,
                                      new ParameterExpression[] { pe1, pe2 }))

Un Func<string, bool> toma solo una string y devuelve un bool . Así que solo tiene un único parámetro. Estás pasando en dos ParameterExpressions . Además, los dos son int parámetros ... no es una cadena a la vista!

Para que puedas usar:

Expression.Lambda<Func<int, int, bool>>(predicateBody,
                                        new ParameterExpression[] { pe1, pe2 }))

... pero supongo que eso no te va a ayudar, si quieres una cláusula Where ...

Dado este comentario:

//queryableData.Where(docTypeId => (docTypeId ==  idTipo) AND idIndice => (idIndice ==  16)) 

... suena como si estuvieras confundido incluso antes de que lleguemos a los árboles de expresión. No puedes combinar dos expresiones lambda como esa.

Yo aconsejo que trabajar con lo que el código se vería como si no lo necesita para construir árboles de expresión, y luego convertirlo. ¿Cuál es el tipo de elemento de queryableData ? Solo obtendrá un valor por prueba de predicado: ¿será un docTypeId o un idIndice ?



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow