Я пытаюсь реорганизовать некоторый код для универсального репозитория, который передает объект фильтра, который будет фильтровать данные, а также страницы, сортировку и т. Д.
Каждый наследует Filter
(например, CustomerFilter)имеет возможность определения своего собственного фильтра выражений, который будет применяться базовым классом в хранилище.
Таким образом, фильтр клиента будет иметь такие свойства:
public string CustomerId { get; set; }
public override Expression<Func<object, bool>> Predicate => c => ((Customer)c).Id == CustomerId;
Тогда хранилище будетзапустите фильтр в репозитории, примерно так (он еще не универсален!):
using (var context = new CustomerContext())
{
return await Filter<Domain.Customer>.ApplyAsync(filter, context.Customers.AsQueryable()).ConfigureAwait(false);
}
Это работает нормально, но мне нужен способ для лучшего построения выражения для более сложных примеров.
Например, фильтр может позволять фильтровать клиентов по состоянию, но только если он установлен.
public string CustomerId { get; set; }
public State? CustomerState { get; set; }
public override Expression<Func<object, bool>> Predicate => c => (((Customer)c).Id == CustomerId) && (((Customer)c).State == CustomerState ?? (Customer)c).State);
Это не только становится беспорядком, но и содержит много ненужного.Кастинг и скобки.Так что я хотел бы сделать построитель выражений в геттере, который бы создавал выражение более чистым способом, например if(State != null) { CustomerState == State; }
.Но здесь я не знаю, как поступить, поэтому, если кто-нибудь сможет мне помочь, я буду признателен.