主从CRUD中如何查询特定ID对应的TaBarBody关联记录
方案1:修改从表查询逻辑,添加过滤条件
首先给BarBody仓储层新增按主表ID筛选的方法:
// 在BarBody的仓储类中添加如下方法 public IEnumerable<TaBarBody> GetBarBByHeaderId(int headerId) { return _db.TaBarBodies .Include(t => t.AnulatFk) .Include(t => t.ImpactFk) .Include(t => t.BarHeaderFk) .Include(t => t.BarTelegramaFk) .Where(t => t.BarHeaderId == headerId) // 新增过滤条件:外键等于当前主表ID .ToList(); }
再修改控制器的Details方法,替换原来的全量查询逻辑:
public IActionResult Details(int id) { HeaderTelegramaViewModel headerTelegramaViewModel = new HeaderTelegramaViewModel(); headerTelegramaViewModel.TaBarHeader = _unitofwork.BarHeader.DetailsBarH(id); // 调用新增的过滤方法,传入当前主表ID headerTelegramaViewModel.taBarBody = _unitofwork.BarBody.GetBarBByHeaderId(id); return View(headerTelegramaViewModel); }
方案2:利用导航属性预加载,无需额外查询从表
你的TaBarHeader模型已经定义了List<TaBarBody> TaBarBodies关联导航属性,直接在主表查询时预加载关联的从表数据,代码更简洁,也符合EF的设计规范:
首先修改DetailsBarH方法,添加从表导航属性的预加载逻辑:
public TaBarHeader DetailsBarH(int? id) { return _db.TaBarHeaders .Include(t => t.CategoriaFk) .Include(t => t.CauzaFk) // 新增:预加载当前主表关联的从表集合,同时加载从表需要的关联属性 .Include(t => t.TaBarBodies) .ThenInclude(b => b.AnulatFk) .Include(t => t.TaBarBodies) .ThenInclude(b => b.ImpactFk) .Include(t => t.TaBarBodies) .ThenInclude(b => b.BarTelegramaFk) .FirstOrDefault(m => m.Id == id); }
再修改控制器的Details方法,直接使用主表的关联从表集合即可:
public IActionResult Details(int id) { HeaderTelegramaViewModel headerTelegramaViewModel = new HeaderTelegramaViewModel(); headerTelegramaViewModel.TaBarHeader = _unitofwork.BarHeader.DetailsBarH(id); // 主表的TaBarBodies已经是和当前主表ID关联的从表记录,直接赋值即可 headerTelegramaViewModel.taBarBody = headerTelegramaViewModel.TaBarHeader.TaBarBodies; return View(headerTelegramaViewModel); }
两种方案均无需修改原有视图代码,即可实现仅展示当前主表对应从表记录的需求。
内容的提问来源于stack exchange,提问作者Homeboy53
相关产品推荐
相关产品推荐

