首页 > 解决方案 > 使用 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");
    }

由于连续调用,我认为这是一种糟糕的方法。有没有办法一次性完成所有工作?

标签: c#entity-framework-core-2.2

解决方案


您可以构建一个查询,将所有 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 与无法访问模型的部分进行通信,例如布局中的标题。


推荐阅读