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