Используйте отражение, чтобы получить лямбда-выражение из свойства Name

Я хочу дать пользователю возможность поиска по разным свойствам. Например

[ВХОДНОЙ ТЕКСТ] | [ВЫБРАТЬ ПАРАМЕТР {ID, ИМЯ, ТЕЛЕФОН}] | [ПОИСК]

И позже я построю свой запрос следующим образом:

repository.Where(lambda-expression)

Где лямбда-выражение строится из выбранной опции {ID, NAME, PHONE} (например: x => x.NAME.Equals(INPUT TEXT))

Есть ли способ построить лямбду из имени свойства, возможно, с помощью отражения?

Спасибо

3 ответа

Решение

Вы не строите лямбда-выражение - вы строите дерево выражений. Это не очень сложно, но требует немного терпения. В вашем примере вам, вероятно, понадобится:

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

Для такого рода вещей я использую что-то вроде этого (примечание: делает 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();
Другие вопросы по тегам