System.ArgumentException: nombre incorrect de paramètres fournis pour la déclaration lambda dans la méthode System.Linq.Expressions

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

Question

Mes amis, j'essaye de construire un arbre d'expression en utilisant System.Linq.Expressions et j'obtiens cette erreur:

Erro: System.ArgumentException: Nombre incorrect de paramètres fournis pour la déclaration lambda dans les paramètres 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) à System.Linq.Expressions.Expression.Lambda [TDelegate] (Corps d'expression, Boolean tailCall, Paramètres IEnumerable`1) à System.Linq.Expressions.Expression.Lambda [TDelegate] (Corps de l'expression, paramètres ParameterExpression []) dans Gedi.Controllers.OperacaoController.opBuscaFile (formulaire FormCollection) dans c: \ Utilisateurs \ Guilherme \ Documents \ Visual Studio 2012 \ Projets \ Gedi \ Gedi \ Controllers \ OperacaoController.cs: ligne 338

Le code:

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);

J'ai adapté ce code à partir d'ici http://msdn.microsoft.com/en-us/library/vstudio/bb882637.aspx

Merci

Réponse acceptée

C'est le problème initial, je pense:

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

Un Func<string, bool> prend qu'une string et retourne un bool . Donc, il n'a qu'un seul paramètre. Vous transmettez deux ParameterExpressions . En outre, ils sont tous deux des paramètres int ... pas une chaîne en vue!

Pour que vous puissiez utiliser:

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

... mais je suppose que cela ne va pas vous aider, si vous voulez une clause Where ...

Compte tenu de ce commentaire:

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

... on dirait que vous êtes confus avant même d'arriver aux arbres d'expression. Vous ne pouvez pas combiner deux expressions lambda comme ça.

Je vous conseille vivement de déterminer à quoi ressemblerait votre code si vous n'aviez pas besoin de créer des arbres d'expression, puis de le convertir. Quel est le type d'élément de queryableData ? Vous n'obtiendrez qu'une valeur par test de prédicat. idIndice t-il d'un docTypeId ou d'un idIndice ?




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi