LINQ to SQL Query для связи «многие ко многим» - PullRequest
2 голосов
/ 17 июля 2010

Я перемещаю старое приложение ASP.net (C #) из простых запросов SQL в LINQ to SQL, и у меня возникли некоторые проблемы с некоторыми из более сложных запросов.В этом случае я пытаюсь получить список сотрудников, которые имеют определенный набор навыков.Пользователь выбирает навыки для поиска, и идентификаторы передаются в метод, который выполняет работу.В старой версии 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 ]

1 голос
/ 17 июля 2010

Вот перевод 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
}
1 голос
/ 17 июля 2010

Прежде всего, лучше, если ваши таблицы не заканчиваются буквой "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));
}

Edit:

например:

public IQueyable<skills> getSkills()
{
    return db.skills.Where(p=>p.id==6 || p.id==1);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...