如何查询联结表

Ste*_*ash 7 .net linq entity-framework junction-table

使用Entity Framework/LINQ,我需要以下帮助.

该数据库有一个People表,其标识列为PersonId.还有一个Skills表,其标识列为SkillId.这两个通过第三个表PeopleSkills连接,PeopleSkills有自己的标识列PeopleSkillsId,引用PersonId的外部列和引用SkillId的外部列.

我尝试编写的方法是传递一个List类型的参数,它包含我们正在寻找的任何技能.该方法应返回链接到输入参数列表中所有技能的List.如何在没有技能列表中的所有技能的情况下构建排除任何人的列表?

我遇到的问题是我的SQL经验非常少.我确实有很多其他编程经验,但SQL对我来说总是有点粗糙.我想过使用Join,但这不会起作用.即如果我的人具有技能A和B,并且搜索列表具有B&C的元素,则联接将在B上匹配它们并返回该人.我需要将这个人排除在外,因为他没有B&C.

我还想过迭代技能列表并构建一个过滤器,但这看起来很难看.这似乎是一个LINQ构建来处理的问题,使用List来查询另一个List,并且应该有一个优雅的解决方案.

Sla*_*uma 0

这可以工作:

public List<Person> GetPeopleWithAllSkills(List<Skill> skills)
{
    var skillIds = skills.Select(s => s.SkillId);

    return context.People.Where(
        p => skillIds.All(id => p.PeopleSkills.Any(ps => ps.SkillId == id)))
        .ToList();
}
Run Code Online (Sandbox Code Playgroud)

给我满足以下条件的人员:所有给定技能都存在Any于这些人员的技能列表中 ( )。(他们的技能可能多于给定的技能,但也不能少于。)