使用反射从属性Name获取lambda表达式

AJC*_*AJC 4 c# reflection lambda entity-framework-4

我想让用户选择不同属性的搜索.例如

[输入文本] | [选择选项{ID,NAME,PHONE}] | [搜索]

然后我会像这样构建我的查询:

repository.Where(lambda-expression)
Run Code Online (Sandbox Code Playgroud)

从所选选项{ID,NAME,PHONE}构建lambda表达式(例如:x => x.NAME.Equals(INPUT TEXT))

有没有办法从Property属性名称构建lambda,也许使用反射?

谢谢

Jon*_*eet 21

您不构建lambda表达式 - 您构建表达式树.这不是很难,但需要一点耐心.在您的样本中,您可能需要:

ParameterExpression parameter = Expression.Parameter(typeof(Foo), "x");
Expression property = Expression.Property(parameter, propertyName);
Expression target = Expression.Constant(inputText);
Expression equalsMethod = Expression.Call(property, "Equals", null, target);
Expression<Func<Foo, bool>> lambda =
   Expression.Lambda<Func<Foo, bool>>(equalsMethod, parameter); 
Run Code Online (Sandbox Code Playgroud)

这是假设:

  • 存储库元素类型是 Foo
  • 您想使用名为的属性 propertyName
  • 你想比较平等 inputText