Как удалить опцию из выбора, если он уже существует в базе данных для пользователя в ядре .net - PullRequest
0 голосов
/ 11 октября 2019

У меня есть страница, на которой учащиеся предоставляют результаты по уровню. В настоящее время, например, студент может зарегистрировать математику более одного раза в одном и том же классе или в другом классе

Я пытался проверить базу данных в методе 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);

Мне нужен результат, который удалит предмет из выпадающего списка, если он уже был выбран этим учеником

Ответы [ 3 ]

1 голос
/ 14 октября 2019

И Крис, и мой ответ предоставляют возможное решение, которое работает аналогично: получите список существующих 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");
0 голосов
/ 11 октября 2019

Поскольку связь между учеником и предметом является много-многим, вам может понадобиться другая таблица с именем SubjectSelected со столбцами StudentId, SubjectId, где subjectSelected - это ссылка на таблицу Subject, а ученик - ссылка на таблицу Student. Таким образом, вы можете просто получить предметы, которых нет в таблице SubjectSelected вашего выпадающего списка. Примерно так:

ViewBag.ListofSubjects = new SelectList(_context.AdmSubjects.Where(s => 
                         !s.SubjectSelected.Any());

После того, как тема выбрана, вы должны убедиться, что строка вставлена ​​в таблицу SubjectSelected.

0 голосов
/ 11 октября 2019

Ваш вопрос до сих пор не совсем понятен, но, исходя из моего понимания, вам необходимо: 1) получить список объектов, выбранных в данный момент пользователем, и 2) удалить эти объекты из списка всех объектов, которые вы храните вSelectList.

У меня нет ваших сущностей для работы, но я предполагаю, что у вас должен быть класс, который действует как соединение между пользователем и субъектами, так как это довольно ясно для многих.

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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...