C#Linq表达式树(使用exists方法在列表中搜索)

时间:2017-05-20 23:26:00

标签: c# linq tree expression

我想形成像

这样的Linq表达式树
listInstance.Exists(c=>c.Age=-40)

我已编写代码,但在调用Expression.Call方法时,它会抛出错误。

我写的代码在这里,

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

2 个答案:

答案 0 :(得分:1)

目前尚不清楚为什么要使用表达式树而不是仅仅调用将lambda传递给Exists,但正如您所要求的那样,您可以在不必建立的情况下执行此操作Expression树本身让编译器为你做了繁重的工作:

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是您从某个地方采购的学生名单。

答案 1 :(得分:-1)

你似乎错过了表达中的等号:

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

将其更改为:

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