Исключите студенческие удостоверения для тех, кто уже зарегистрировался

#c# #linq #entity-framework-core

Вопрос:

Я пытаюсь сделать то же самое, что я сделал бы, используя SQL не в команде в ef core.

 var studentsForTeam = await api.GetAllStudentsByTeamId(item.TeamId);
SessionId = item.Id;
TeamId = item.TeamId;

List<SessionStudent> studentsToRemove = await api.GetALLStudentsSessions();
// we want to remove the students that have alreeady arrived for a session.
var alreadyAttendend = studentsToRemove.Where(x=>x.isAbesent==false amp;amp; 
x.isArrived==true).Select(x => x.StudentId );

var studentsnotArrvied = studentsToRemove.Where(w=>w.isAbesent==false amp;amp; 
                         !alreadyAttendend.Contains(w.Id) ).ToList();

//I only want this to produce buttons for students that have not already checked in.
CheckInButtonsStudents(studentsForTeam);
 

Так, например, у меня есть

Студенческие Столы

Студенческий билет Описание
117 Доктор
118 Марта Джонс

У меня есть Таблица Студенческих сессий

Идентификатор сезона Студенческий билет ИзАбсент Прибыл
86 117 Ложный Правда
87 118 Правда ложный

Поэтому мне нужно, чтобы мой запрос, приведенный выше, содержал информацию о том, где в студенческой сессии существует идентификатор студента, где isAbsent false и isArrived true, чтобы исключить его из запроса «Студенты для команды».

Это моя функция регистрации

 public async void CheckInButtonsStudents(ObservableCollection<Student> students)
{
    string name = string.Empty;
    checkinButtons.Children.Clear(); //just in case so you can call this code several times np..
    foreach (var item in students)
    {

        var btn = new Button()
        {

            AutomationId = StudentId.ToString(),
            BackgroundColor = Color.Blue,
            TextColor = Color.White,
            Text = item.FirstName   " "   item.Surname,

        };
        btn.BindingContext = item; // add this here

        btn.Clicked  = BtnStudents_Clicked;

        checkinButtons.Children.Add(btn);
    }

}
 

Ответ №1:

Поэтому мне нужно, чтобы мой запрос, приведенный выше, содержал информацию о том, где в студенческой сессии существует идентификатор студента, где isAbsent false и isArrived true, чтобы исключить его из запроса «Студенты для команды».

Если я вас правильно понимаю, вы хотите, чтобы все студенты, у studentsForTeam которых есть студенческий билет, участвовали в студенческих сессиях, и студенческая сессия была зарегистрирована, но не была закрыта?

У нас уже есть эти студенческие сессии alreadyAttended (isArrived amp;amp; !isAbsent). Таким образом, мы можем отфильтровать studentsforTeam студентов с удостоверением alreadyAttended личности .

 var studentsForCheckIn = studentsForTeam
    .Where(s => alreadyAttended.Contains(s.id))
    .ToList();

CheckInButtonsStudents(studentsForCheckIn);
 

Затем я рекомендую вам немного упростить свой код:

 // I think you have a typo here: use isAbsent instead of isAbesent
// Don't compare for == true or == false. !isAbsent is the same as isAbsent == false
var alreadyAttendend = studentsToRemove
    .Where(x => !x.isAbsent amp;amp; x.isArrived)
    .Select(x => x.StudentId);

// Here you select students that are not absent AND not in alreadyAttendend.
// That's the same as not absent and not arrived. If you write it like that, it's easier to read
var studentsNotArrvied = studentsToRemove
    .Where(w => !w.isAbsent amp;amp; !w.isArrived).ToList();