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

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

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

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

repository.Where(lambda-expression) 

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

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

谢谢

您不构建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> lambda = Expression.Lambda>(equalsMethod, parameter); 

这是假设:

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

对于那种事情,我使用这样的东西(注意:做一个Where“Like”):

  public static IQueryable Where(this IQueryable source, string propertyName, string value) { Expression> whereExpression = x => x.GetType().InvokeMember(propertyName, BindingFlags.GetProperty, null, x, null).ObjectToString().IndexOf(value, StringComparison.InvariantCultureIgnoreCase) >= 0; return source.Where(whereExpression); } 

我不得不面对同样的问题,以下方法完美地解决了我的问题。

 PropertyInfo propertyInfoObj = MyClassObject.GetType().GetProperty(PropertyName); repository.Where(x => propertyInfoObj.GetValue(x) == SearchValue).Select(x => propertyInfoObj.GetValue(x)).FirstOrDefault();