如果 .net core 中用户的数据库中已经存在,如何从 select 中删除选项
How to remove option from select if already exists in database for the user in .net core
我有一个页面供学生提供他们的 Olevel 结果。例如,目前,一个学生可以多次注册同一年级或其他年级的数学
我试过在 GET 方法中检查存在学生编号和主题的数据库
ViewBag.ListofSubjects = new SelectList(_context.AdmSubjects, "SubjectId", "SubjectName");
ViewBag.ListofGrades = new SelectList(_context.AdmSubjectGrades, "GradeId", "Grade");
ViewBag.jambreg = regNo;
var stolevel = _context.StApplicationsOlevel.FirstOrDefault(i => i.JambregNo == regNo);
var stolevel = _context.StApplicationsOlevel.Include(x => x.JambregNo).Where(x => !x.JambregNo.Any()).ToList();
return View(stolevel);
我需要一个结果,如果该学生已经选择了该主题,则该结果将从下拉列表中删除该主题
您的问题还不是很清楚,但根据我的理解,您需要 1) 获取用户当前选择的主题列表,以及 2) 从您选择的所有主题列表中删除这些主题存储在 SelectList
.
我没有你的实体可以使用,但我假设你应该有一个 class 作为用户和主题之间的连接,因为这是一个非常明确的多对多。
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
var selectedSubjectIds = await _context.UserSubjects.Where(x => x.UserId == userId).Select(x => x.SubjectId);
然后:
ViewBag.ListofSubjects = new SelectList(await _context.AdmSubjects.Where(x => !selectedSubjectIds.Contains(x.SubjectId).ToListAsync(), "SubjectId", "SubjectName");
由于学生和学科之间的关系是多对多的,您可能需要另一个名为 SubjectSelected 的 table 包含 StudentId、SubjectId 列,其中 subjectSelected 是对学科 table 的引用,而学生是对学生table。这样您就可以简单地检索不在下拉列表中的 SubjectSelected table 中的主题。
如下所示。
ViewBag.ListofSubjects = new SelectList(_context.AdmSubjects.Where(s =>
!s.SubjectSelected.Any());
选择主题后,您必须确保将行插入到 SubjectSelected table。
Chris 和我的回复都提供了类似的可行解决方案:使用您的 StudentId
获取现有 SubjectNames
的列表以及 Student 和 Subject 之间的关系,然后检索没有这些名称的数据。
您没有显示 Subject
和 Student
之间的关系,假设它们是 many-to-many 关系:
public class Student
{
[Key]
public int Id { get; set; }
public string StudentName { get; set; }
public List<StudentSubject> StudentSubjects { get; set; }
}
public class Subject
{
[Key]
public int SubjectId { get; set; }
public string SubjectName { get; set; }
public List<StudentSubject> StudentSubjects { get; set; }
public int? SubjectGradeId { get; set; }
public SubjectGrade SubjectGrade { get; set; }
}
public class StudentSubject
{
public int? StudentId { get; set; }
public Student Student { get; set; }
public int? SubjectId { get; set; }
public Subject Subject { get; set; }
}
数据库上下文:
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<StudentSubject>()
.HasKey(pt => new { pt.SubjectId, pt.StudentId });
builder.Entity<StudentSubject>()
.HasOne(pt => pt.Student)
.WithMany(p => p.StudentSubjects)
.HasForeignKey(pt => pt.StudentId);
builder.Entity<StudentSubject>()
.HasOne(pt => pt.Subject)
.WithMany(t => t.StudentSubjects)
.HasForeignKey(pt => pt.SubjectId);
}
您可以检索像
这样的数据
var studentId = 1;
var existedNames = _context.StudentSubject.Where(s => s.StudentId == studentId).Select(s => s.Subject.SubjectName).ToList();
//You need to get list based on your own models
ViewBag.ListofSubjects = new SelectList(_context.AdmSubjects.Where(s=> !existedNames.Contains(s.SubjectName)), "SubjectId", "SubjectName");
我有一个页面供学生提供他们的 Olevel 结果。例如,目前,一个学生可以多次注册同一年级或其他年级的数学
我试过在 GET 方法中检查存在学生编号和主题的数据库
ViewBag.ListofSubjects = new SelectList(_context.AdmSubjects, "SubjectId", "SubjectName");
ViewBag.ListofGrades = new SelectList(_context.AdmSubjectGrades, "GradeId", "Grade");
ViewBag.jambreg = regNo;
var stolevel = _context.StApplicationsOlevel.FirstOrDefault(i => i.JambregNo == regNo);
var stolevel = _context.StApplicationsOlevel.Include(x => x.JambregNo).Where(x => !x.JambregNo.Any()).ToList();
return View(stolevel);
我需要一个结果,如果该学生已经选择了该主题,则该结果将从下拉列表中删除该主题
您的问题还不是很清楚,但根据我的理解,您需要 1) 获取用户当前选择的主题列表,以及 2) 从您选择的所有主题列表中删除这些主题存储在 SelectList
.
我没有你的实体可以使用,但我假设你应该有一个 class 作为用户和主题之间的连接,因为这是一个非常明确的多对多。
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
var selectedSubjectIds = await _context.UserSubjects.Where(x => x.UserId == userId).Select(x => x.SubjectId);
然后:
ViewBag.ListofSubjects = new SelectList(await _context.AdmSubjects.Where(x => !selectedSubjectIds.Contains(x.SubjectId).ToListAsync(), "SubjectId", "SubjectName");
由于学生和学科之间的关系是多对多的,您可能需要另一个名为 SubjectSelected 的 table 包含 StudentId、SubjectId 列,其中 subjectSelected 是对学科 table 的引用,而学生是对学生table。这样您就可以简单地检索不在下拉列表中的 SubjectSelected table 中的主题。 如下所示。
ViewBag.ListofSubjects = new SelectList(_context.AdmSubjects.Where(s =>
!s.SubjectSelected.Any());
选择主题后,您必须确保将行插入到 SubjectSelected table。
Chris 和我的回复都提供了类似的可行解决方案:使用您的 StudentId
获取现有 SubjectNames
的列表以及 Student 和 Subject 之间的关系,然后检索没有这些名称的数据。
您没有显示 Subject
和 Student
之间的关系,假设它们是 many-to-many 关系:
public class Student
{
[Key]
public int Id { get; set; }
public string StudentName { get; set; }
public List<StudentSubject> StudentSubjects { get; set; }
}
public class Subject
{
[Key]
public int SubjectId { get; set; }
public string SubjectName { get; set; }
public List<StudentSubject> StudentSubjects { get; set; }
public int? SubjectGradeId { get; set; }
public SubjectGrade SubjectGrade { get; set; }
}
public class StudentSubject
{
public int? StudentId { get; set; }
public Student Student { get; set; }
public int? SubjectId { get; set; }
public Subject Subject { get; set; }
}
数据库上下文:
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<StudentSubject>()
.HasKey(pt => new { pt.SubjectId, pt.StudentId });
builder.Entity<StudentSubject>()
.HasOne(pt => pt.Student)
.WithMany(p => p.StudentSubjects)
.HasForeignKey(pt => pt.StudentId);
builder.Entity<StudentSubject>()
.HasOne(pt => pt.Subject)
.WithMany(t => t.StudentSubjects)
.HasForeignKey(pt => pt.SubjectId);
}
您可以检索像
这样的数据var studentId = 1;
var existedNames = _context.StudentSubject.Where(s => s.StudentId == studentId).Select(s => s.Subject.SubjectName).ToList();
//You need to get list based on your own models
ViewBag.ListofSubjects = new SelectList(_context.AdmSubjects.Where(s=> !existedNames.Contains(s.SubjectName)), "SubjectId", "SubjectName");