使用 Entity Framework 核心获取多个表

Get multiple tables using Entity Framework Core

我需要填充许多选择列表,我正在这样做

     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");
    }

我认为这是一个糟糕的方法,因为连续调用。有没有办法一次搞定?

您可以构造一个查询,将所有 id 和 name 字段组合在一个查询中,如果您还添加鉴别器,则可以在之后进行过滤。我没有时间测试代码,但它可能是这样的:

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 与无法访问模型的部分进行通信,例如布局中的标题。