使用反射从属性名称中获取lambda表达式

本文关键字:获取 lambda 表达式 反射 从属性 | 更新日期: 2023-09-27 18:06:58

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

[INPUT TEXT] | [SELECT OPTION {ID, NAME, PHONE}] | [SEARCH]

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

repository.Where(lambda-expression)

其中lambda表达式是从所选选项{ID, NAME, PHONE}构建的(例如:x => x. name。

=(输入文本)

是否有一种方法来构建从属性名称也许使用反射lambda ?

谢谢

使用反射从属性名称中获取lambda表达式

您构建的不是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); 

的假设:

  • 存储库元素类型为Foo
  • 你想使用一个名为propertyName
  • 的属性
  • 您想与inputText
  • 进行相等性比较

对于这类事情,我使用这样的东西(注意:does a Where " like "):

 public static IQueryable<TEntity> Where<TEntity>(this IQueryable<TEntity> source, string propertyName, string value) 
    {
        Expression<Func<TEntity, bool>> 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();
相关文章: