2

仲間、私は System.Linq.Expressions を使用して式ツリーを構築しようとしていますが、このエラーが発生しています:

エラー: System.ArgumentException: 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, IEnumerable1 parameters) でのラムダ宣言に指定されたパラメーターの数が正しくありません System.Linq.Expressions.Expression.Lambda[TDelegate](Expression System.Linq.Expressions.Expression.Lambda[TDelegate](式本体、ParameterExpression[] パラメーター) at Gedi.Controllers.OperacaoController.opBuscaFile(FormCollection フォーム) c:\Users\ 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);

ここからこのコードを採用しましたhttp://msdn.microsoft.com/en-us/library/vstudio/bb882637.aspx

ありがとう

4

1 に答える 1

5

これが最初の問題だと思います:

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

AFunc<string, bool>は a だけを取り、 astringを返しますbool。したがって、パラメータは 1 つしかありません。あなたは2 つ ParameterExpressionsを通過しています。また、それらは両方とも intパラメーターです...目に見える文字列ではありません!

したがって、次を使用できます。

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

Where...しかし、条項が必要な場合、それは役に立たないと思います...

このコメントを考えると:

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

...式ツリーにたどり着く前から混乱しているようですね。このように 2 つのラムダ式を組み合わせることはできません。

式ツリーを作成する必要がなければ、コードがどのようになるかを調べてから、変換すること強くお勧めします。の要素タイプはqueryableData何ですか? 述語テストごとに 1 つの値のみを取得します。それは adocTypeIdまたは anになりidIndiceますか?

于 2012-12-20T11:35:59.373 に答える