查看多对多关系的替代模型

问题描述 投票:0回答:1

在 ASP.NET 和实体框架中,用户和教室之间存在多对多关系。我正在尝试获取班级中的学生名单。到目前为止,我知道 2 个解决方案:创建用户/类视图模型,或在控制器和视图之间传递

ViewBag.ClassId

有没有办法让查看页面使用

@model IEnumerable<Models.User> 

Model.Class
获取信息而不创建新的视图模型?

我习惯了 java jsp,我可以在其中传递任何类型的变量,所以我对这种视图/模型限制很陌生。

(用户和类模型是从数据库中构建的,其中“userclass”表作为连接表)。

到目前为止,我只是将

viewbag.classId
传递给每个控制器并将其作为参数:

public async Task<IActionResult> ClassStudents(int id)
{
    var usersInClass = await _context.Classes
                        .Where(cls => cls.Id == id)
                        .Include(cls => cls.Users) // Eager loading to load associated users
                        .Select(cls => cls.Users.Where(user => user.RoleSettingId == 5))
                        .FirstOrDefaultAsync();

    ViewBag.ClassId = id;

    return View("/Views/Classroom/ClassStudents.cshtml", usersInClass);
}
asp.net-core entity-framework-core asp.net-core-mvc many-to-many
1个回答
0
投票

由于 User 和 Classroom 类已经配置了多对多关系,因此您可以使用导航属性来显示 Model.User 中的类信息。
请参考以下示例:

我的模特:

public class User
{
     public int ID { get; set; }
     public string Name { get; set; }
     public IList<Classroom> Classrooms { get; set; } = new List<Classroom>();

}

public class Classroom
{
     [Key]
     public int CID { get; set; }

     public string CName { get; set; }
     public IList<User> User { get; set; } = new List<User>();

}

我的数据库上下文:

public SchoolDbcontext(DbContextOptions<SchoolDbcontext> options)
: base(options) { }
public DbSet<User> User { get; set; }
public DbSet<Classroom> Classrooms { get; set; }
       } 
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
     modelBuilder.Entity<Classroom>().HasMany(x => x.User).WithMany(st => st.Classrooms);
}

控制器:

     public async Task<IActionResult> ClassStudentsAsync(int id)
   {
       var classnum = _context.Classrooms.Include(x=>x.User).FirstOrDefault(cls => cls.CID == id);
       var stu = new List<User>();
       for (var i = 0; i < classnum.User.Count; i++)
       {
           var students = classnum.User[i];
           stu.Add(students);
       }
       return View(stu);
            
   }

我的 CSHTML:

@using WebApplication1.Models
@model IEnumerable<WebApplication1.Models.User>

<h1>Student List</h1>

<table>
    <thead>
        <tr>
            <th>Student ID</th>
            <th>Name</th>
            <th>ClassName</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var user in Model)
        {
            <tr>
                <td>@user.ID</td>
                <td>@user.Name</td>
                <td>@user.Classrooms.FirstOrDefault().CName</td>
            </tr>
        }
    </tbody>
</table>
        

当我给出班级ID时:2

另外,关于查询语句,可以查看如下语句: 结果是用户列表。

在我的示例代码中,User 和 ClassRooms 配置为多对多关系,UserClass 是联接表。

var userlist = _dbContext.ClassRooms.Where(c => c.ClassID == id)
                        .Include(cls => cls.UserClass.Where(c => c.ClassId == id)) // Eager loading to load associated users
                        .ThenInclude(uc => uc.User)
                        .SelectMany(cls => cls.UserClass.Select(c=>c.User)).ToList();

var userlist2 = _dbContext.User.Include(u => u.UserClass.Where(c=>c.ClassId == id)).ThenInclude(c=>c.ClassRoomes).Where(cls => cls.UserClass.Any(c => c.ClassId == id)).ToList();

致以诚挚的问候,

Dlankd

© www.soinside.com 2019 - 2024. All rights reserved.