LINQ to SQL查询多对多关系

时间:2010-07-17 00:17:43

标签: c# linq linq-to-sql

我正在将一个旧的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查询吗?

alt text http://i32.tinypic.com/25focg2.jpg

2 个答案:

答案 0 :(得分:1)

首先,如果您的表格不以“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);
}

答案 1 :(得分: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查询将会失败(我认为这是可能的,因为您有&gt;在你的子句中= 2而不是= 2)。在这种情况下,以下查询更适合:

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
}