繁体   English   中英

LINQ to SQL 查询多对多关系

[英]LINQ to SQL Query for Many-to-Many relationship

我正在将旧的 ASP.net (C#) 应用程序从普通 SQL 查询迁移到 LINQ to SQL,并且在处理一些更复杂的查询时遇到了一些麻烦。 在这种情况下,我试图获取具有特定技能的员工列表。 用户选择要搜索的技能,并将 ID 提供给执行工作的方法。 在旧的 SQL 版本中,我只是将 WHERE 子句附加到每个技能的字符串中。 这是一个示例查询:

SELECT DISTINCT e.firstname, e.lastname, e.username
FROM employees AS e
WHERE e.id IN (SELECT es.emp_id 
FROM emp_skl AS es 
WHERE es.skl_id = 6 OR es.skl_id = 11 
GROUP BY es.emp_id
HAVING COUNT(es.emp_id) >= 2)

关键是 HAVING COUNT 子句,因为它确保返回的员工拥有所有技能,而不仅仅是一项技能。 无论如何,有人可以帮我把它变成一个可靠的 LINQ 查询吗?

替代文字

首先,最好不要以“S”结尾。

现在代码,假设你已经有了一个函数,你会得到一个技能列表:

IQueryable<skills> listSkills = getSkills();
IQueryable<employees> listEmployees = db.employees;

foreach(var skill in listSkills)
{
    listEmployees=listEmployees
        .Where(p=>p.emp_skls.Any(q=>q.skl_id==skill.id));
}

编辑:

例如:

public IQueyable<skills> getSkills()
{
    return db.skills.Where(p=>p.id==6 || p.id==1);
}

这是您的 SQL 查询的 LINQ 翻译:

from e in Employees
where e.Emp_Skls.Count (es => es.Skl_id == 6 || es.skl_id == 11) >= 2
select new
{
  e.FirstName, e.LastName, e.UserName
}

但是,如果您想要的查询是“给我同时拥有技能 6 和 11 的员工”,那么如果员工的技能 6 或 11 出现两次,您的 SQL 查询将失败(我认为这是可能的,因为您有 >= 2 而不是=2 在你的 have 子句中)。 在这种情况下,以下查询更适合:

from e in Employees
where e.Emp_Skls.Any (es => es.Skl_id == 6) &&
      e.Emp_Skls.Any (es => es.Skl_id == 11)
select new
{
  e.FirstName, e.LastName, e.UserName
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM