c# - 使用 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 与无法访问模型的部分进行通信,例如布局中的标题。
推荐阅读
- sql-server - 为什么我会收到 DbUpdateException:OptimisticConcurrencyException?
- django - 可以将 OrderedDict 作为 Celery 任务参数传递吗?
- javascript - Ag-Grid 树结构,将 autoGroupColumn 更改为隐藏 ID
- ruby-on-rails - 添加 gem "font-awesome-rails" 后捆绑安装问题
- android - Android Studio 自动补全顺序
- c# - Xamarin Forms:导航返回按钮上的冻结屏幕
- amazon-redshift - Amazon Redshift 中的奇怪转换行为
- r - R: Create a global variable with the name of a function's input
- python - Python不更新列表值
- python - 在 SQLAlchemy 中将复合键与 SQLite 一起使用时遇到问题,不断收到有关传递太多参数的错误