@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'"
  • Вопрос задан
  • 64 просмотра
Решения вопроса 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, соответственно, должна выполняться проверка, подпадает ли объект под строку поиска или нет.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы