查询EF Core一对多和进一步的一对多关系

Querying EF Core one-to-many and further one-to-many relationship

我有 3 个模型,CompetitionTeamTeamUser。每个比赛都有很多团队,每个团队都有很多用户。当 return 将数据发送到视图时,我想使用 EF Core 将所有 3 个绑定在一起,但我无法真正绑定到用户。因此,我必须在我看来实现一些复杂的逻辑,虽然它有效,但看起来非常混乱和混乱。我确定有办法 return 将数据整合在一起。

Competition 型号 class:

public class Competition
{
    [Key]
    public int ID { get; set; }
    [Required]
    [Display(Name = "Competition Name")]
    public string CompetitionName { get; set; }
    [Required]
    public string Status { get; set; }

    public ICollection<Team> Teams { get; set; }
}   

Team 型号 class:

public class Team
{
    [Key]
    public int TeamID { get; set; }

    [Required]
    [DisplayName("Team Name")]
    public string TeamName { get; set; }

    [ForeignKey("CompetitionID")]
    public int CompetitionID { get; set; }

    public ICollection<TeamUser> TeamUsers { get; set; }

}

TeamUser 型号 class:

public class TeamUser
{
    [Key]
    public int TeamUserID { get; set; }

    [ForeignKey("TeamId")]
    public int TeamId { get; set; }
    public string UserId { get; set; }
}

这是我的控制器。

public IActionResult Index()
{
     var competition = _context.Competitions
         .Include(c => c.Teams)
         .ToList();

     var teamUsers = _context.TeamUsers
         .ToList();

     if (competition == null)
     {
         return NotFound();
     }

     CompetitionIndexViewModel vm = new CompetitionIndexViewModel();
     vm.Competition = competition;
     vm.TeamUsers = teamUsers;

     return View(vm);
}

如您所见,它非常混乱,我不得不求助于使用 viewmodel 来获取我的数据。希望有一个更简单的解决方案。非常感谢!

您不需要使用 CompetitionIndexViewModel。只需按如下方式编写您的查询并将 List<Competition> 传递给视图。

public IActionResult Index()
{
     List<Competition> competitions = _context.Competitions
         .Include(c => c.Teams).ThenInclude(t => t.TeamUsers)
         .ToList();

     return View(competitions);
}

现在在视图中每个 Competition 应该有一个 Teams 的列表,每个 Team 应该有一个 TeamUsers.

的列表