System.ArgumentException:System.Linq.Expressions方法中为lambda声明提供的参数数量不正确

时间:2012-12-20 11:30:08

标签: c# .net linq linq-to-sql expression-trees

Mates,我正在尝试使用System.Linq.Expressions构建表达式树,我收到此错误:

  

Erro:System.ArgumentException:为lambda声明提供的参数数量不正确        在System.Linq.Expressions.Expression.ValidateLambdaArgs(类型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](表达体,   Boolean tailCall,IEnumerable`1参数)        在System.Linq.Expressions.Expression.Lambda [TDelegate](表达体,   ParameterExpression []参数)        在C:\ Users \ Guilherme \ Documents \ Visual Studio中的Gedi.Controllers.OperacaoController.opBuscaFile(FormCollection表单)   2012 \ Projects \ Gedi \ Gedi \ Controllers \ OperacaoController.cs:第338行

代码:

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

我已从此处http://msdn.microsoft.com/en-us/library/vstudio/bb882637.aspx

调整了此代码

由于

1 个答案:

答案 0 :(得分:5)

这是最初的问题,我想:

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

Func<string, bool>仅需string并返回bool。所以它只有一个参数。你传递的是两个 ParameterExpressions。此外,他们两个 int参数......看不到字符串!

所以你可以使用:

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

...但我的猜测是,如果你想要一个Where条款,那对你没有帮助......

鉴于此评论:

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

......听起来你甚至在我们到达表达树之前就感到困惑。你不能像这样组合两个lambda表达式。

如果需要构建表达式树,然后转换它,我强烈建议您弄清楚代码的样子。 queryableData的元素类型是什么?你只会为每个谓词测试获得一个值 - 那将是docTypeId还是idIndice