2010-07-17 2 views
2

Я перемещаю старое приложение ASP.net (C#) из простых SQL-запросов в LINQ to SQL и испытываю некоторые проблемы с некоторыми более сложными запросами. В этом случае я пытаюсь получить список сотрудников, обладающих определенным набором навыков. Пользователь выбирает навыки поиска, а идентификаторы передаются методу, который выполняет эту работу. В старой версии SQL я просто добавлял предложения WHERE к строке для каждого навыка. Вот пример запроса:LINQ to SQL Query для отношений Many-to-Many

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

Хороший ход, проводя схему схемы. –

ответ

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

Edit:

, например:

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

Множественные имена таблиц - это огромная дискуссия. Некоторые утверждают, что набор строк, представляющих объекты, должен быть плюрализован. –

+0

да .. Я имею в виду, это просто с точки зрения linq ... потому что он становится неоднозначным между сущностью и сущностями из таблицы – Francisco

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», ваш SQL-запрос завершится неудачно, если умение 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 
}