И Крис, и мой ответ предоставляют возможное решение, которое работает аналогично: получите список существующих SubjectNames
, используя ваш StudentId
и отношения между студентом и субъектом, а затем получите данные без этих имен.
Вы не показываете свои отношения между Subject
и Student
, предполагая, что они являются отношениями «многие ко многим» :
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; }
}
dbcontext:
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");