Dim*_*ngo 2 .net c# linq expression-trees linq-to-sql
Mates,我正在尝试使用System.Linq.Expressions构建表达式树,我收到此错误:
Erro:System.ArgumentException:
1 parameters) at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, String name, Boolean tailCall, IEnumerableSystem.Linq.Expressions.Expression.Lambda [TDelegate](表达式)System.Linq.Expressions.Expression.ValidateLambdaArgs(类型delegateType,Expression&body,ReadOnlyCollection 1参数)中为lambda声明提供的参数数量不正确在System.Linq.Expressions.Expression.Lambda [TDelegate](表达式体,ParameterExpression []参数)的body,Boolean tailCall,IEnumerable`1参数)在C:\ Users \中的Gedi.Controllers.OperacaoController.opBuscaFile(FormCollection表单) Guilherme\Documents\Visual Studio 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);
Run Code Online (Sandbox Code Playgroud)
我从这里改编了这段代码http://msdn.microsoft.com/en-us/library/vstudio/bb882637.aspx
谢谢
这是最初的问题,我想:
Expression.Lambda<Func<string, bool>>(predicateBody,
new ParameterExpression[] { pe1, pe2 }))
Run Code Online (Sandbox Code Playgroud)
A Func<string, bool>只取一个string并返回一个bool.所以它只有一个参数.你要过两次 ParameterExpressions.而且,它们都是 int参数......不是视线中的字符串!
所以你可以使用:
Expression.Lambda<Func<int, int, bool>>(predicateBody,
new ParameterExpression[] { pe1, pe2 }))
Run Code Online (Sandbox Code Playgroud)
...但我的猜测是,如果你想要一个Where条款,这对你没有帮助......
鉴于此评论:
//queryableData.Where(docTypeId => (docTypeId == idTipo) AND idIndice => (idIndice == 16))
Run Code Online (Sandbox Code Playgroud)
......听起来你甚至在我们到达表达树之前就感到困惑.你不能像这样组合两个lambda表达式.
我强烈建议你锻炼你的代码是什么样子,如果你没有需要建立表达式树,然后将其转换.什么是元素类型queryableData?你只需要为每个谓词测试获得一个值 - 这是一个docTypeId还是一个idIndice?
| 归档时间: |
|
| 查看次数: |
2691 次 |
| 最近记录: |