如果 .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()).ToLis‌​t();
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 之间的关系,然后检索没有这些名称的数据。

您没有显示 SubjectStudent 之间的关系,假设它们是 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");