2010-07-17 78 views
2

我正在将旧的ASP.net(C#)应用程序从普通SQL查询转换为LINQ to SQL,并且在某些更复杂的查询中遇到了一些麻烦。在这种情况下,我试图找到一个拥有一定技能的员工名单。用户选择搜索技能并将ID提供给执行该工作的方法。在旧的SQL版本中,我只是将WHERE子句添加到每个技能的字符串中。下面是一个例子查询:用于多对多关系的LINQ to SQL查询

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

+0

发送架构图的好举措。 – 2010-07-17 01:50:51

回答

1

首先,它的更好,如果你的表不以“S”结尾。

现在的代码,asuming你已经有一个功能哟获得的技能列表:

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); 
} 
+0

复数表名是一个巨大的争论。有人会争辩说,代表对象的行的集合应该被复数化。 – 2010-07-17 01:49:24

+0

是的..我的意思是,它只是从linq的角度来看......因为它在实体和表中的实体之间变得模糊不清 – Francisco 2010-07-17 06:29:18

1

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

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出现两次,员工就会失败(我认为这是可能的,因为您有> = 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 
}