@lucky4

Как написать обобщенный фильтр?

Делаю для апишки пагинацию и фильтрацию. К сожалению, я не хотел использовать такой вариант, с работой обобщенных запросов, но от безысходности приходится писать что-то лично мне не совсем понятное. Кое как, нашел варианты и подстроил под себя для "сортировки по", но сейчас проблема заключается в "поиску по":
public static Expression<Func<T, object>> ToLambda<T>(string propertyName)
        {
            var parametr = Expression.Parameter(typeof(T));
            var property = Expression.Property(parametr, propertyName);
            var propObject = Expression.Convert(property, typeof(object));

            return Expression.Lambda<Func<T, object>>(propObject, parametr);
        }

        public static IQueryable<T> ApplyOrdering<T>(this IQueryable<T> source, 
            string propertyName, bool desc = false)
        {
            return desc != true ?
                source.OrderBy(ToLambda<T>(propertyName))
                : source.OrderByDescending(ToLambda<T>(propertyName));
        }

        public static IQueryable<T> ApplySearching<T>(this IQueryable<T> source,
            string propertyName, string input)
        {
            return source.Where(ToLambda<T>(propertyName) == input);
        }


ApplySearching -> я бы это делал так, если бы делал напрямую через какой-то сервис-контроллер: where(x=>x.propNAME == "xxx"). Но в обобщенной этой функции у меня ошибка => "System.Linq.Expressions.Expression>' to 'System.Func'"
  • Вопрос задан
  • 61 просмотр
Решения вопроса 1
@cicatrix
было бы большой ошибкой думать
В данном примере строка сравнивается с Func.

Я бы сделал так:
public interface IMyItem
{
    bool IsMatch(string pattern);
}

public static IQueryable<T> ApplyFilter<T>(this IQueryable<T> source, string filtertext) where T: IMyItem
{
    return source.Where(item => item.IsMatch(filtertext));
}


Единственный минус - объекты, которые фильтруются, должны будут реализовать интерфейс IMyItem.
В методе IsMatch, соответственно, должна выполняться проверка, подпадает ли объект под строку поиска или нет.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы