Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
IQueryable<TProjection> Apply(IQueryable<TProjection> query)
выглядит странно. Не понятно что оно должно делать. Можете привести пример как этим пользоваться? Спасибо!public class SomeFilter: AutoSpec<MyNiceEntity>
{
public string Name {get;set;}
public int? Rating {get;set;}
}
query = query.Where(x => x.StartsWith(Name)). Если Rating будет не null, то query = query.Where(x => x.Rating == Rating)можно написать базовый объект для фильтрации чего-угодноя здесь что-то не увидел. Получаем базовый класс, который подходит только для entities, у которых есть свойства Name и Rating. Очень большой риск использовать этот базовый класс не правильно, что приведёт к ошибке в run time
AutoSpec, добавили названия полей, который вам нужно фильтровать. Готов фильтр. При этом логику фильтрации вы не пишете, вы только указываете названия полей. Сам тип нужен для:Specification, чего я делать не хочу по причинам, описанным в начале статьи.К сожалению && и || по-человечески не переопределишь
(spec1 && spec2).Equals(spec1 && spec2);
Expression<Func<T, bool>> — это уже компонуемая спека. Но чтобы сделать красивые And и Or нужно попотеть с ParameterRebinder. Поэтому, я решил провести небольшой рефакторинг и теперь код мне нравится даже больше.IsDeleted == false, серьёзно? Я думал так только новички пишут
Шаблон проектирования «Спецификация» в C#