2017-05-20 7 views
-1

私は、コードを書かれているが、Expression.Callメソッドを呼び出すときに、それがエラーを投げC#のLINQの式ツリー(使用してリストで検索する方法が存在する)

listInstance.Exists(c=>c.Age=-40) 

のようなLINQの式ツリーを形成したいと思います。

listInstance.Exists(c=>c.Age=40) 

変更それに:

listInstance.Exists(c => c.Age == 40) 
+0

Existsの名前で新しいExtensionメソッドを作成しようとしていますか? – mvermef

+0

いいえExpressionクラスを使用してListクラスのExistsメソッドを使用しようとしています –

+0

@ KannanSrinivasan:なぜですか?既存の方法ではできない、ここで何を達成しようとしていますか?既存の '.Exists()'や単純なLINQ '.Any()'を使うのはなぜですか? – Flater

答えて

-1

は思わなぜラムダをExistsに渡すのではなく、式ツリーを使用するのか明確ではありませんが、あなたは、あなたがコンパイラをさせることによって自分自身をExpressionツリーを構築することなく、これを行うことができます求めているSはあなたのための重い物を持ち上げるん:今、あなたは言うことができる

static LambdaExpression MakeExistsExpression(int age) 
{ 
    Expression<Func<List<Student>, bool>> func= (listInstance) => listInstance.Exists(c => c.Age == age); 
    return (LambdaExpression)func; 
} 

var func = MakeExistsExpression(40); 
var lambda = (Func<List<Student>,bool>)func.Compile(); 
bool found = lambda(students); 

studentsは、あなたがどこかから調達した学生のリストです。

+0

あなたのレスポンスに感謝します。私はc => c.Age == 40を含みましたが、Expression.Callはエラーを投げていますvar e1 = Expression .Lambda(expr、新しいParameterExpression [] {パラメータ}); var left = Expression.Call(slInstance、methodInfo、e1); –

+0

あなたは質問のコードの欠陥を指摘しましたが、これは質問された質問には答えません。 – Flater

1

はそれだ、あなたの式に等号を逃したように私が書いたコードはここにある

private static string GetExprString<T>(List<Student> listInstance,int valueExpr){ 

    var methodInfo = typeof(List<Student>).GetMethod("Exists",new Type[] { typeof(Predicate<Student>)});    

    var parameter = Expression.Parameter(typeof(Student), "c"); 
    var masterProperty = Expression.Property(parameter, typeof(Student).GetProperty("Age")); 
    var slInstance = Expression.Constant(sList); 

    var expr = Expression.Equal(masterProperty, Expression.Constant(valueExpr)); 
    e1 = Expression.Lambda(expr, new ParameterExpression[] {parameter }); 
    var left = Expression.Call(slInstance, methodInfo, e1); 

    return string.empty; 
} 
+1

ちょうど私がちょうど入力していたもの。私は、コンパイラを使うことができるだけで、手動で表現木を作ることを不必要に多くの人がやっているのを見ています。 –

関連する問題