我有以下实体:
以及以下多对多连接实体:
一个工作和一个志愿者都有多个才能。我想搜索所有人才与志愿人员相同的工作。
我该怎么做?目前,我正在使用以下代码,但结果是我得到了包含一个(或多个)必需人才的所有职位。我只想找到志愿者(至少)具有所有必需人才的职位。
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);
}
答案 0 :(得分:0)
第一个选项
为志愿者选择所有人才ID,并将其存储在列表/数组中,然后在作业的条件语句中使用此列表
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();