В этом случае я могу применить много много условных выражений. Я не знаю, как с этим справиться
Как гласит старая поговорка. «Как вы едите слона? Так же, как и все остальное, один укус за раз».
У вас есть большой метод с условиями, которые применяются к нескольким поискам. Некоторые условия будут применяться к нескольким. Так что разбей это. Вы не будете делать себе одолжение с именами классов и методов, такими как «Methods» и «Methods.Methodss»
public class EquipmentLookupService
{
private readonly AppDbContext _context = null;
public EquipmentLookupService(AppDbContext context)
{
_context = context ?? throw new ArgumentNullException("context");
}
public IEnumerable<Computer> GetComputers(string manufacturer, string processor)
{
var query = _context.Computers.AsQueryable();
if(!string.IsNullOrEmpty(manufacturer))
query = query.Where(x => x.Manufacturer == manufacturer);
if(!string.IsNullOrEmpty(processor))
query = query.Where(x => x.Processor == processor);
return query.ToList();
}
}
Тогда действие вашего контроллера изменится на что-то вроде:
var vm = new HomeIndexVM
{
Computers = EquipmentLookupService.GetComputers(manufacturer, processor),
Phones = EquipmentLookupService.GetPhones(manufacturer),
// etc...
};
return View(vm);
В качестве базового c начального примера. Вы можете создавать методы для загрузки каждого типа поиска и добавлять любые условия, применимые к каждому поиску.
Запросы Linq могут содержать условные операторы, такие как:
query = _context.Computers.Where(x => (manufacturer == null || x.Manufacturer == manufacturer) && (processor == null || x.Processor == processor));
, что может показаться меньшим количеством кода, однако Я не рекомендую использовать такой условный код в выражениях Linq. Во-первых, это может быть намного сложнее для чтения и может скрыть ошибки logi c с неуместными скобками или операциями. Во-вторых, он встроен в SQL, что приводит к большим, более сложным операторам SQL для условий, которые просто не нужно применять. В предыдущем примере условная проверка сохраняется в коде, поэтому критерии добавляются в сгенерированные операторы SQL только в том случае, если они необходимы.
Ключом к написанию эффективного (быстрого) Linq является предотвращение преждевременного выполнения выражение, например, ToList()
перед добавлением условий. В результате происходит возврат большого количества ненужных данных из базы данных на сервер, что требует времени и памяти, прежде чем данные будут отфильтрованы.