【问题标题】:C# Linq Expression Tree ( searching in a lists using exists method) [closed]C# Linq 表达式树(使用存在方法在列表中搜索)[关闭]
【发布时间】:2017-05-20 23:25:59
【问题描述】:

我想形成一个类似的 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;
}

【问题讨论】:

  • 您是否尝试创建一个名为 Exists 的新扩展方法?
  • 不,我正在尝试使用表达式树在 List 类中使用 Exists 方法
  • @KannanSrinivasan:为什么?您想在这里完成哪些现有方法无法完成的任务?为什么不使用现有的.Exists(),甚至是简单的LINQ .Any()
  • 为什么要手动构建Expression 而不仅仅是传递一个 lambda?您使用这种方法有什么特别的原因吗?正如您所发现的,它要复杂得多。
  • 感谢您的回复。我正在尝试构建一个业务规则引擎,它将动态构建规则并验证对象

标签: c# linq tree expression


【解决方案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 是您从某个地方采购的学生列表。

【讨论】:

  • 正是我刚刚输入的内容。我看到很多人不必要地尝试手动制作表达式树,而他们可以只使用编译器。
【解决方案2】:

您的表达式中好像漏掉了一个等号:

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

改成:

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

【讨论】:

  • 感谢您的回复。我包含了 c=>c.Age==40 ,但 Expression.Call 仍然抛出错误 var e1 = Expression.Lambda(expr, new ParameterExpression[] {parameter } ); var left = Expression.Call(slInstance, methodInfo, e1);
  • 您指出了问题代码中的一个缺陷,但这并不能回答所提出的问题。
猜你喜欢
  • 1970-01-01
  • 2018-01-09
  • 2020-08-29
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多