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