System.ArgumentException: Falsche Anzahl von Parametern, die für die Lambda-Deklaration in der System.Linq.Expressions-Methode angegeben wurden

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

Frage

Mates, ich versuche, einen Ausdrucksbaum mit System.Linq.Expressions zu erstellen, und ich erhalte diesen Fehler:

Error: System.ArgumentException: Falsche Anzahl von Parametern, die für die Lambda-Deklaration bei System.Linq.Expressions.Expression.ValidateLambdaArgs (Typ delegateType, Expression & body, ReadOnlyCollection 1 parameters) at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, String name, Boolean tailCall, IEnumerable 1 Parameter) at System.Linq.Expressions.Expression.Lambda [TDelegate] (Expression body, Boolean tailCall, IEnumerable`1 Parameter) bei System.Linq.Expressions.Expression.Lambda [TDelegate] (Ausdruck body, ParameterExpression [] Parameter) bei Gedi.Controllers.OperacaoController.opBuscaFile (FormCollection-Formular) in c: \ Benutzer \ Guilherme \ Dokumente \ Visual Studio 2012 \ Projekte \ Gedi \ Gedi \ Controllers \ OperaCaController.cs: Zeile 338

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

Ich habe diesen Code von hier http://msdn.microsoft.com/en-us/library/vstudio/bb882637.aspx angepasst

Vielen Dank

Akzeptierte Antwort

Dies ist das Anfangsproblem, denke ich:

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

Ein Func<string, bool> nimmt nur einen string und gibt einen bool . Es hat also nur einen einzigen Parameter. Sie übergeben zwei ParameterExpressions . Außerdem sind sie beide int Parameter ... keine Schnur in Sicht!

So könnten Sie verwenden:

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

... aber ich schätze, das hilft dir nicht, wenn du eine Where Klausel willst ...

Angesichts dieses Kommentars:

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

... es klingt, als ob du verwirrt bist, bevor wir zu den Ausdrucksbäumen kommen. Sie können zwei Lambda-Ausdrücke nicht kombinieren.

Ich rate Ihnen dringend, herauszufinden, wie Ihr Code aussehen würde, wenn Sie keine Ausdrucksbäume erstellen und diese dann konvertieren müssten. Was ist der Elementtyp von queryableData ? Sie erhalten nur einen Wert pro Prädikatstest - ist das eine docTypeId oder eine idIndice ?



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum