Получить значение свойства внутри лямбда-выражения, используя отражение - PullRequest
0 голосов
/ 04 июля 2018

У меня есть объект с именем SearchDetails, который содержит:

SearchDetails: 
{ ColName: "StrName"
  SearchVal" "mega" }

Я делаю общее лямбда-выражение с помощью метода отражения.

    public dynamic searchMethod(object SearchDetails)
    {
        ParameterExpression Parameter = Expression.Parameter(typeof(SearchDetails), "x");

        var searchCol = Expression.Property(
         Parameter,
         SearchDetails.GetType().GetProperty("ColName")

       );
        var colVal = Expression.Property(
          Parameter,
          SearchDetails.GetType().GetProperty("SearchValue").Name
        );

       Expression contMethod = Expression.Call(searchCol, "Contains", null, colVal);
        Expression<Func<SearchDetails, bool>> lambda =
           Expression.Lambda<Func<SearchDetails, bool>>(contMethod, Parameter);

        return lambda;
    }

Проблема в том, что я получаю лямбда-выражения следующим образом:

{x => x.ColName.Contains(x.SearchValue)}

Однако я хочу, чтобы это было так: {x => x.StrName.Contains("megabrand")}. Я не могу получить доступ к значению свойств: ColName и SearchValue. Как решить эту проблему?

1 Ответ

0 голосов
/ 04 июля 2018

То, что вы ищете, вероятно, примерно так:

public static Expression<Func<TSource, bool>> SearchMethod<TSource>(SearchDetails searchDetails)
{
    ParameterExpression par = Expression.Parameter(typeof(TSource), "x");

    var col = Expression.Property(par, searchDetails.ColName);

    Expression body = Expression.Call(col, "Contains", null, Expression.Constant(searchDetails.SearchVal));

    var lambda = Expression.Lambda<Func<TSource, bool>>(body, par);
    return lambda;
}

Обратите внимание, что вам нужно где-то передать тип вашей таблицы, в данном случае в качестве универсального параметра TSource.

Используйте это как:

var search = new SearchDetails
{
    ColName = "Foo",
    SearchVal = "Bar",
};

var lambda = SearchMethod<TbStore>(search);

В качестве альтернативы вы можете использовать System.Linq.Dynamic.Core , чтобы получить нечто подобное.

var result = db.Where(searchDetails.ColName + ".Contains(@0)", searchDetails.SearchVal);
...