簡體   English   中英

兩個連接實體之間的EF核心查詢

[英]EF Core Query between two join entities

我有以下實體:

  • 志願者
  • 工作
  • 天賦

並遵循多對多聯接實體:

  • 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);
}

第一選擇

為志願者選擇所有人才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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM