Я пытаюсь реализовать текстовый поиск по столбцам в таблице / представлении, имеющем большое количество столбцов, и, поскольку они время от времени меняются, я хочу динамически создавать запрос с использованием отражения. в с #.
То, что я хочу, это что-то вроде:
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?