Linq to Entities - ограничение результатов формы поиска только теми результатами, которые соответствуют всем вариантам отношения «многие ко многим» - PullRequest
1 голос
/ 04 ноября 2010

В моей заявке есть 3 таблицы

Сотрудник
Код сотрудника
Имя сотрудника
DOB

Навыки
SkillID
Описание

EmployeeSkills
EmployeeID
SkillID
YearsExperience

Что такоелучший способ написать запрос linq, чтобы позволить пользователю одновременно выполнять поиск информации в таблице Employee и ограничивать результаты теми, кто соответствует всем выбранным навыкам?У меня нет проблем, когда это один навык или любой другой из выбранных, но я застрял на том, как вернуться, только когда они соответствуют всем.Лучшее, что мне удалось сделать, - это отвратительная масса пересечений.

Ответы [ 2 ]

1 голос
/ 04 ноября 2010

Вы можете зацикливаться на связанных навыках, а затем добавлять Where (x => x.Skills.Contails (skill)) к запросу для каждого запрошенного навыка.Это исключит каждого сотрудника, у которого нет всех навыков.

0 голосов
/ 04 ноября 2010

Вот решение, которое я придумал, используя очень простую версию структуры вашей таблицы:

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', чтобы увидеть, обеспечивает ли он требуемое поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...