Получение данных из базы данных и их фильтрация по обнуляемой строке в ASP. Net MVC и Entity Framwork - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть таблица Computers в моей базе данных, и она отправляется контроллеру в модели представления (vm здесь).

Я отправляю фильтр со строкой запроса и хочу отфильтровать данные таблицы Computers с этими Фильтры, которые НЕ НУЛЬ. memoryType.

Код:

//GET: Product/notebooks
[Route("Product/Notebooks")]
public ActionResult Notebooks(string producer, string os, string memoryType, string memory, string displayType, string processorType, string ram, string vc)
{
    ViewBag.Producer = producer;
    ViewBag.OS = os;
    ViewBag.MemoryType = memoryType;
    ViewBag.Memory = memory;
    ViewBag.DisplayType = displayType;
    ViewBag.ProcessorType = processorType;
    ViewBag.RAM = ram;
    ViewBag.VC = vc;

    var vm = Methods.Methodss.createHIVM();
    return View(vm);
}

createHIVM(); метод здесь и работает везде:

public static HomeIndexVM createHIVM()
{
    ProtelEntities dbProtel = new ProtelEntities();

    var phones = dbProtel.Phones.ToList();
    var producers = dbProtel.Producers.ToList();
    var computers = dbProtel.Computers.ToList();
    var sliders = dbProtel.Sliders.ToList();
    var contact = dbProtel.Contacts.FirstOrDefault();
    var memoryTypes = dbProtel.MemoryTypes.ToList();
    var memories = dbProtel.Memories.ToList();
    var rams = dbProtel.RAM.ToList();
    var cameras = dbProtel.Cameras.ToList();
    var displaytypes = dbProtel.DisplayTypes.ToList();
    var OS = dbProtel.OS.ToList();
    var osversions = dbProtel.OSVersions.ToList();
    var proCategories = dbProtel.ProCategory.ToList();
    var processorTypes = dbProtel.ProcessorTypes.ToList();
    var simTypes = dbProtel.SimTypes.ToList();
    var vcCategories = dbProtel.VCCategories.ToList();
    var vcSubcategories = dbProtel.VCSubcategories.ToList();
    var vcMemories = dbProtel.VCMemories.ToList();

    var vm = new HomeIndexVM
        {
            Computers = computers,
            Phones = phones,
            Producers = producers,
            Sliders = sliders,
            Contact = contact,
            Cameras = cameras,
            VCSubcategories = vcSubcategories,
            VCMemories = vcMemories,
            VCCategories = vcCategories,
            SimTypes = simTypes,
            DisplayTypes = displaytypes,
            Memories = memories,
            MemoryTypes = memoryTypes,
            OS = OS,
            OSVersions = osversions,
            ProCategories = proCategories,
            ProcessorTypes = processorTypes,
            RAMs = rams
        };

    return vm;
}

1 Ответ

0 голосов
/ 14 февраля 2020

В этом случае я могу применить много много условных выражений. Я не знаю, как с этим справиться

Как гласит старая поговорка. «Как вы едите слона? Так же, как и все остальное, один укус за раз».

У вас есть большой метод с условиями, которые применяются к нескольким поискам. Некоторые условия будут применяться к нескольким. Так что разбей это. Вы не будете делать себе одолжение с именами классов и методов, такими как «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() перед добавлением условий. В результате происходит возврат большого количества ненужных данных из базы данных на сервер, что требует времени и памяти, прежде чем данные будут отфильтрованы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...