2012-12-20 3 views
1

메이트에서 람다 선언 제공된 매개 변수의 잘못된 수, 나는 System.Linq.Expressions를 사용하여 식 트리를 구축을 위해 노력하고 있는데이 오류가 점점 오전 :System.ArgumentException : System.Linq.Expressions 방법

Erro: System.ArgumentException: Incorrect number of parameters supplied for lambda declaration at 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 parameters) at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, Boolean tailCall, IEnumerable`1 parameters) at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, ParameterExpression[] parameters) at Gedi.Controllers.OperacaoController.opBuscaFile(FormCollection form) in c:\Users\Guilherme\Documents\Visual Studio 2012\Projects\Gedi\Gedi\Controllers\OperacaoController.cs:line 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

타 NKS

+1

어떤 행이 338입니까? 거기에 잘못된 개수의 매개 변수를 제공하고 있습니다. 덕분에 – Jodrell

답변

4

이 초기 문제가, 내 생각 :

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

... 표현 트리에 도착하기 전에 혼란스러워하는 것 같습니다. 그런 두 개의 람다 표현식을 결합 할 수는 없습니다.

이 표현 트리를 작성한 다음에 입력하지 않은 경우 코드가 어떻게 생겼는지 확인할 것을 강력히 권장합니다. 요소 유형이 queryableData 인 이유는 무엇입니까? 조건부 테스트 당 하나의 값만 얻으려고합니다. docTypeId 또는 idIndice이 될 것입니까?

+0

. 내가 필요한 것은 dinamically where 절을 만드는 것입니다. 검색 양식을 기반으로하는 알 수없는 조건부 수를 전달해야합니다. 나는 예를 들어 3 필드를 가지며 사용자는 단지 2를 기준으로 사용할 수 있습니다. 또는 때때로 나는 5 개의 들판을 가지고 있으며, 그 때 모두를 사용할 수 있습니다. 나는 진행하는 방법이 없다. –

+0

@DimasLongo : 그러나 Where 절만 * 값을 얻을 수 있습니다. 예를 들어,'queryableData.Where (x => x.DocTypeId == idTipo && x.IdIndice == 16)'와 같은 것을 빌드하는 것이 더 합리적 일 것입니다. 그러나 당신은 속성 표현을 사용하여 엔티티로부터 다른 비트를 추출합니다. –

+0

그걸 기반으로 queryableData.Where (x => x.DocTypeId == idTipo && (x.IdIndice == 16 && x.IdIndice.value == 'value')) ..이 가능할 것입니다 .. 나는 다른 idIndice .. 예를 들어 idIndice == 16에 대해 값 x를 확인하고 idIndice == 17에 대해 값 y를 확인하십시오. –

관련 문제