System.ArgumentException: numero errato di parametri forniti per la dichiarazione lambda nel metodo System.Linq.Expressions

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

Domanda

Compagni, sto cercando di costruire un albero di espressioni usando System.Linq.Expressions e sto ottenendo questo errore:

Erro: System.ArgumentException: numero errato di parametri forniti per la dichiarazione lambda su System.Linq.Expressions.Expression.ValidateLambdaArgs (Type delegateType, Expression & body, 1 parameters) at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, String name, Boolean tailCall, IEnumerable ReadOnlyCollection 1 parameters) at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, String name, Boolean tailCall, IEnumerable 1 parameters) a System.Linq.Expressions.Expression.Lambda [TDelegate] (Corpo espressione, Booleano tailCall, IEnumerable`1 parametri) su System.Linq.Expressions.Expression.Lambda [TDelegate] (Corpo dell'espressione, ParameterExpression [] parametri) in Gedi.Controllers.OperacaoController.opBuscaFile (modulo FormCollection) in c: \ Users \ Guilherme \ Documents \ Visual Studio 2012 \ Projects \ Gedi \ Gedi \ Controllers \ OperacaoController.cs: linea 338

Il codice:

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

Ho adattato questo codice da qui http://msdn.microsoft.com/en-us/library/vstudio/bb882637.aspx

Grazie

Risposta accettata

Questo è il problema iniziale, penso:

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

A Func<string, bool> prende solo una string e restituisce un bool . Quindi ha solo un singolo parametro. Stai passando due ParameterExpressions . Inoltre, sono entrambi parametri int ... non una stringa in vista!

Quindi puoi usare:

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

... ma la mia ipotesi è che non ti aiuterà, se vuoi una clausola Where ...

Dato questo commento:

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

... sembra che tu sia confuso ancor prima di arrivare agli alberi di espressione. Non è possibile combinare due espressioni lambda del genere.

Ti consiglio vivamente di capire come sarebbe il tuo codice se non avessi bisogno di costruire alberi di espressioni e poi convertirlo. Qual è il tipo di elemento di queryableData ? Otterrai solo un valore per test di predicato: sarà un docTypeId o un idIndice ?



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché