Asp.net core 查询EF核心一对多和进一步的一对多关系
我有三种型号,Asp.net core 查询EF核心一对多和进一步的一对多关系,asp.net-core,entity-framework-core,ef-core-2.1,Asp.net Core,Entity Framework Core,Ef Core 2.1,我有三种型号,Competition,Team和TeamUser。每场比赛都有许多队,每个队都有许多用户。我想在将数据返回到视图时使用EF Core将所有3个绑定在一起,但我不能真正绑定到用户。因此,在我看来,我必须实现一些复杂的逻辑,尽管它有效,但看起来非常混乱和混乱。我相信有一种方法可以一起返回数据 竞赛车型类别: public class Competition { [Key] public int ID { get; set; } [Required] [
Competition
,Team
和TeamUser
。每场比赛都有许多队,每个队都有许多用户。我想在将数据返回到视图时使用EF Core将所有3个绑定在一起,但我不能真正绑定到用户。因此,在我看来,我必须实现一些复杂的逻辑,尽管它有效,但看起来非常混乱和混乱。我相信有一种方法可以一起返回数据
竞赛
车型类别:
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; }
}
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; }
}
public class TeamUser
{
[Key]
public int TeamUserID { get; set; }
[ForeignKey("TeamId")]
public int TeamId { get; set; }
public string UserId { get; set; }
}
TeamUser
model 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; }
}
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; }
}
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
。只需按如下方式编写查询,并将列表
传递给视图
public IActionResult Index()
{
List<Competition> competitions = _context.Competitions
.Include(c => c.Teams).ThenInclude(t => t.TeamUsers)
.ToList();
return View(competitions);
}
public IActionResult Index()
{
列出比赛=_context.competitions
.Include(c=>c.Teams)。然后Include(t=>t.TeamUsers)
.ToList();
返回视图(竞赛);
}
现在在视图中,每个
竞赛
都应该有一个团队的列表
,每个团队
都应该有一个团队用户的列表
,,以及它有什么乱七八糟的地方(除了此代码在控制器中,没有抽象,您返回的所有数据都未经过滤,=大量数据)?使用视图模型是一种有效的方法,视图模型正是为之而设计的,它将数据转化为一个视图的形状来使用它(在视图中直接使用实体或作为WebAPI结果是一种糟糕的做法)。我不完全理解您的第一行。非常抱歉。。。“它有什么乱七八糟的地方(除了此代码在控制器中,没有抽象,并且返回所有未经过滤的数据,=大量数据)?”您是否正在寻找然后包含?是的,绝对正确。我刚才试过了,但发现了一些错误。现在我回去检查它的工作@zzdhxu:这些错误只是intellisense错误,因为.thenClude
无法确定您想要的是单包含还是复数包含(在t或t的集合上)。Visual Studio Itellisence存在问题,可能不会给您任何intellisense或intellisense错误。你只需要继续打字。我刚才也试过,但没用。只要再试一次,它的工作就很奇怪……例如,如果您只需要具有特定名称的团队,您会如何筛选?