Фильтрация списка из базы данных с помощью Func (C#)

уважаемые форумчане!

Сломал я уже себе всю голову, нужна ваша помощь, никак не могу разобраться )

Имеется интерфейс IClientService

public interface IClientService{

Task<List<Client>> SearchClientsByPhone(string phone);

Task<List<Client>> SearchClientsByName(string name);}

А так же класс, который его реализует

public class ClientService : IClientService{
private readonly ApplicationContext _context;

public ClientService(ApplicationContext context)
{
    _context = context;
}

public async Task<List<Client>> SearchClientsByPhone(string phone)
=> await SearchClients(x => x.Phone.StartsWith(phone));

public async Task<List<Client>> SearchClientsByName(string name)
    => await SearchClients(x => x.Name.StartsWith(name));

private async Task<List<Client>> SearchClients(Expression<Func<Client, bool>> filter)
    => await _context.Clients.Where(filter).AsNoTracking().ToListAsync();}

А так же сама команда вызова

public async Task SearchParameters()
{
    List<Client> result;
    if (_searchName)
        result = await _clientService.SearchClientsByName(_searchString);
    else
        result = await _clientService.SearchClientsByPhone(_searchString);

    Clients = new ObservableCollection<Client>(result);
}

Clients - коллекция, которую отображает ListBox.

Имеется 1 общее поле и параметры для фильтрации. Поиск осуществляется по 1 из 3 параметров:

  1. По номеру телефона
  2. По имени
  3. По гос.номеру

А так же, дополнительно, можно указать промежуток времени, за который осуществлять поиск. От одной даты до другой. Если посмотреть на класс ClientService, то мы увидим, что с первыми 2 пунктами проблем не возникло, т.к. данные находятся в таблице Client. Данные гос.номера находятся в таблице Vehicle. Связь один Client к многим Vehicle Данные о визите находятся в таблице Visit. Связь один Vehicle к многим Visit.

Подскажите, пожалуйста, как правильно реализовать фильтрацию по гос.номеру и разным временным промежуткам, чтобы в конечном итоге в список клиентов попали именно те клиенты, которых мы отфильтровали по параметрам. При этом, временные промежутки могут быть не указаны, значит поиск происходит по всей таблице.

Интересует именно реализация, которая в классе ClientService, используя Func и остальное.

Пожалуйста, подкиньте пару идей, как это можно сделать, или покажите пример частичной реализации.

Буду безмерно благодарен! Спасибо....


Ответы (0 шт):