Запуск нескольких методов в столбце с использованием дерева выражений - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь реализовать текстовый поиск по столбцам в таблице / представлении, имеющем большое количество столбцов, и, поскольку они время от времени меняются, я хочу динамически создавать запрос с использованием отражения. в с #.

То, что я хочу, это что-то вроде:

SELECT * FROM VW_PRILOZENA_DOK WHERE LOWER(VW_PRILOZENA_DOK.*propName*) 
LIKE LOWER('*searchText*')

Лямбда-выражения, такие как:

  table.Where(s => s.*propName*.ToLower().Contains(*searchText*)

было бы тем, что мне нужно, но поскольку мне нужно отражение, оно не сработает.

Итак, мне нужно использовать явные выражения. Вот что у меня есть:

private static readonly MethodInfo Contains = typeof(string).GetMethod("Contains", new[] { typeof(string)});

public static Expression<Func<VW_PRILOZENA_DOK, bool>> SearchPredicate(IEnumerable<string> properties, string searchText)
    {
        if (String.IsNullOrWhiteSpace(searchText) == false)
        {
            var param = Expression.Parameter(typeof(VW_PRILOZENA_DOK));
            var search = Expression.Constant(searchText);

            var components = properties
                .Select(propName => Expression.Call(Expression.Property(param, propName), Contains, search))
                .Cast<Expression>()
                .ToList();
            var body = components
                .Skip(1)
                .Aggregate(components[0], Expression.OrElse);
            return Expression.Lambda<Func<VW_PRILOZENA_DOK, bool>>(body, param);
        }

        return m => true;

    }

на основе: Как написать строку. Содержит (someText) в дереве выражений

Где я передаю результат этой функции в .Where ()

Это работает, но мне не хватает нижнего регистра. Я не очень хорошо знаком с linq, но кто-нибудь может мне помочь в этом разобраться?

EDIT: часть отражения - это список свойств, который был создан с использованием отражения.

РЕШЕНО!

.Select(propName =>
                {
                    var dynamicExpression = Expression.Call(Expression.Property(param, propName), ToLower);
                    return Expression.Call(dynamicExpression, Contains, search);
                })

Теперь, кто-нибудь может сказать мне, если это хорошее решение для моего запроса, насколько далеко идет linq?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...