Получить несколько таблиц с помощью Entity Framework Core - PullRequest
1 голос
/ 19 июня 2019

Мне нужно заполнить много списков выбора, и я делаю это так

     public void OnGet()
    {
        ViewData["CelulaId"] = new SelectList(_context.Celulas, "Id", "Nome");
        ViewData["UAPId"] = new SelectList(_context.UAP, "Id", "Nome");
        ViewData["ReferenciaId"] = new SelectList(_context.Referencias, "Id", "Nome");
        ViewData["CelulaTipoId"] = new SelectList(_context.CelulaTipos, "Id", "Nome");
    }

Я предполагаю, что это плохой подход из-за последовательных вызовов.Есть ли способ сделать все за один раз?

1 Ответ

2 голосов
/ 19 июня 2019

Вы можете создать запрос, который объединит все поля идентификатора и имени в одном запросе, который вы можете отфильтровать впоследствии, если добавите дискриминатор.У меня нет времени для тестирования кода, но это может быть что-то вроде этого:

var res = _context.Celulas.Select(c => new { Id, Nome, Discriminator = "Celulas"})
    .Union(_context.UAP.Select(c => new { Id, Nome, Discriminator = "UAP"}))
    .Union(_context.Referencias.Select(c => new { Id, Nome, Discriminator = "Referencias"}))
    .Union(_context.CelulaTipos.Select(c => new { Id, Nome, Discriminator = "CelulaTipos"}));

И затем передать его в модель представления:

var viewModel = new ViewModel
{
    CelulaId = new SelectList(res.Where(r => r.Discriminator == "Celulas"), "Id", "Nome"),
    UAPId = new SelectList(res.Where(r => r.Discriminator == "UAP"), "Id", "Nome"),
    ReferenciaId = new SelectList(res.Where(r => r.Discriminator == "Referencias"), "Id", "Nome"),
    CelulaTipoId = new SelectList(res.Where(r => r.Discriminator == "CelulaTipos"), "Id", "Nome")
};

Но я сомневаюсь, что этодействительно быстрее, чем у вас уже есть.Это только добавляет сложности.Альтернативой может быть использование перечислений, чтобы вам вообще не приходилось запрашивать базу данных.

В качестве примечания я бы не использовал ViewData для этого.Вместо этого добавьте списки в ViewModel .Я бы использовал ViewData для связи с частями, которые не имеют доступа к модели, например, заголовок в макете.

...