Вот решение, которое я придумал, используя очень простую версию структуры вашей таблицы:
var q = from e in Employee
join es in EmployeeSkills
on e.EmployeeID equals es.EmployeeID
join s in Skills
on es.SkillID equals s.SkillID
group s by e into grouping
where !skillsToMatch.Except(grouping.Select(x => x.SkillID)).Any()
select grouping.Key;
Где «skillToMatch» - это IE из множества SkillID, которые вы хотите иметь у Сотрудника. Он вернет всех сотрудников, которые, по крайней мере, обладают всеми навыками в «skillToMatch».
Если у вас установлен linqpad , вы можете увидеть, как это работает с моими фиктивными данными с помощью этого скрипта:
var Employee = new [] {
new { EmployeeID = 1 },
new { EmployeeID = 2 },
new { EmployeeID = 3 },
new { EmployeeID = 4 },
new { EmployeeID = 5 },
};
var Skills = new [] {
new { SkillID = 1 },
new { SkillID = 2 },
new { SkillID = 3 },
new { SkillID = 4 },
new { SkillID = 5 },
};
var EmployeeSkills = new [] {
new { EmployeeID = 1, SkillID = 4 },
new { EmployeeID = 1, SkillID = 5 },
new { EmployeeID = 3, SkillID = 4 },
new { EmployeeID = 3, SkillID = 1 },
new { EmployeeID = 5, SkillID = 3 },
};
var skillsToMatch = new [] { 4, 5 };
var q = from e in Employee
join es in EmployeeSkills
on e.EmployeeID equals es.EmployeeID
join s in Skills
on es.SkillID equals s.SkillID
group s by e into grouping
where !skillsToMatch.Except(grouping.Select(x => x.SkillID)).Any()
select grouping.Key;
q.Dump();
Поиграйте, изменив массив 'skillToMatch', чтобы увидеть, обеспечивает ли он требуемое поведение.