EF Core Query между двумя объединяемыми объектами - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть следующие объекты:

  • Волонтер
  • Работа
  • Talent

И после нескольких объединяющихся сущностей:

  • JobVolunteer
  • JobTalent
  • TalentVolunteer

И работа, и волонтер имеют несколько талантов. Я хочу найти все рабочие места, где их таланты совпадают с талантами волонтера.

Как я могу это сделать? На данный момент я использую следующий код, но в результате я получаю все задания, которые содержат один (или более) из необходимых талантов. Я хочу найти только рабочие места, где у Волонтера есть (по крайней мере) все необходимые таланты.

public async Task<IActionResult> FindJobs(int? id)
{
            if (id == null)
            {
                return NotFound();
            }

            var volunteer = await _context.Volunteers
                .Include(v => v.TalentVolunteers)
                    .ThenInclude(v => v.Talent)
                .FirstOrDefaultAsync(m => m.VolunteerID == id);

            if (volunteer == null)
            {
                return NotFound();
            }

            var jobs = new List<Job>();
            var talentVolunteers = new HashSet<int>(volunteer.TalentVolunteers.Select(t => t.TalentID));

            foreach (var talent in _context.JobTalents)
            {
                if (talentVolunteers.Contains(talent.TalentID))
                {
                    var selectedJob = _context.Jobs
                        .Include(t => t.JobTalents)
                            .ThenInclude(v => v.Talent)
                        .SingleOrDefault(t => t.JobID == talent.JobID);

                    jobs.Add(selectedJob);
                }
            }

            var volunteersFindJobsViewModel = _mapper.Map<Volunteer, VolunteersFindJobsViewModel>(volunteer);

            volunteersFindJobsViewModel.Jobs = jobs;

            return View(volunteersFindJobsViewModel);
}

1 Ответ

0 голосов
/ 22 апреля 2019

Первый вариант

Выберите все идентификаторы талантов для добровольца и сохраните их в списке / массиве, а затем используйте этот список в условном выражении задания

var volunteerTalentIds = _context.TalentVolunteer.Where(a=>a.VolunteerId == {yourVolunteerId}).Select(a=>a.TalentId).ToList();

var selectedJobs = _context.Jobs.Include(a=>a.JobTalents).Where(a=>a.JobTalents.All(b=>volunteerTalentIds.Contains(b.TalentId))).ToList();

Второй вариант

сделать длинную цепочку соединений

var selectedJobs = (from job in _context.Jobs 
join jobTalent in _context.JobTalents on jobTalent.JobId equals job.JobId 
join volunteerTalent in _context.VolunteerTalents on jobTalent.TalentId equals volunteetTalent.TalentId 
where volunteerTalent.VolunteerId = {yourVolunteerId} select job).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...