Linq到实体-将搜索表单的结果限制为仅与多对多关系的所有选项匹配的结果

Linq到实体-将搜索表单的结果限制为仅与多对多关系的所有选项匹配的结果,linq,entity-framework,linq-to-entities,Linq,Entity Framework,Linq To Entities,我的应用程序中有3个表 员工 员工ID 员工姓名 DOB 技能 斯基利德 说明 员工技能 员工ID 斯基利德 年经验 编写linq查询以允许用户同时搜索Employee表中的信息并将结果限制为与所选所有技能匹配的人的最佳方式是什么?当它是一种技能,或者是那些被选中的技能中的任何一种技能时,我都没有问题,但是我被困在只有当它们匹配所有技能时才返回的问题上。到目前为止,我所管理的最好的方法就是大量的交叉点。您可以循环检查所选的技能,然后为每个请求的技能在查询中添加一个Where(x=>x.skill

我的应用程序中有3个表

员工
员工ID
员工姓名
DOB

技能
斯基利德
说明

员工技能
员工ID
斯基利德
年经验


编写linq查询以允许用户同时搜索Employee表中的信息并将结果限制为与所选所有技能匹配的人的最佳方式是什么?当它是一种技能,或者是那些被选中的技能中的任何一种技能时,我都没有问题,但是我被困在只有当它们匹配所有技能时才返回的问题上。到目前为止,我所管理的最好的方法就是大量的交叉点。

您可以循环检查所选的技能,然后为每个请求的技能在查询中添加一个Where(x=>x.skills.Contails(skill))。这将消除每一个不具备所有技能的员工。

您可以循环检查所选技能,然后为每个请求的技能在查询中添加Where(x=>x.skills.Contails(skill))。这将消除每个不具备所有技能的员工。

以下是我使用非常简单的表结构版本提出的解决方案:

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”是您希望员工拥有的SkillID的IEnumerable。它将返回所有至少具备“SkillTomatch”中所有技能的员工

如果您已经安装了,您可以通过以下脚本了解这是如何处理我的虚拟数据的:

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”数组,看看它是否提供了您想要的行为。以下是我使用非常简单的表结构版本提出的解决方案:

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”是您希望员工拥有的SkillID的IEnumerable。它将返回所有至少具备“SkillTomatch”中所有技能的员工

如果您已经安装了,您可以通过以下脚本了解这是如何处理我的虚拟数据的:

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”数组,看看它是否提供了您所寻求的行为