2013-05-08 2 views
0

Я не вижу, где проблема, связанная с следующим кодом. Я пытаюсь получить тех сотрудников, которые называются ответственными за определенные вакансии. У меня около 20 вакансий в моей БД, назначенных примерно 16 сотрудникам, и около 1801 записей сотрудников в таблице сотрудников. Код всегда возвращает результат с 1801 элементами.следующий linq, выполняющий левое внешнее соединение вместо внутреннего соединения

from emp in container.Employees 
join p in container.Vacancies 
on emp.EMPID equals p.ResponsibleOfficer into j 
group j by new {k1=emp.EMPID,k2=emp.NAME} into g 
select new { EmpId = g.Key.k1, Name = g.Key.k2 , Count = g.Count()} 

Я хочу что-то похожее на этот

select emp.EmpId,emp.Name,Count(*) as count 
from Vacancies p, Employees e 
where p.ResponsibleOfficer=e.EmpId 
group by e.EmpId,e.Name 

любая помощь очень ценится. thanks

+2

Пожалуйста, обратите внимание на предварительный просмотр, когда вы разместите вопрос, и попытаться отформатировать пост красиво. Я отредактировал запрос, чтобы избежать неудачного отступа. –

ответ

1

Вы используете join ... into. Это будет всегда возвращает единственный результат для каждого элемента исходной последовательности, даже если в правой последовательности нет совпадений.

Вы можете отфильтровать записи без каких-либо элементов в j используя where пункт:

from emp in container.Employees 
join p in container.Vacancies 
on emp.EMPID equals p.ResponsibleOfficer into j 
where j.Any() 
group j by new {k1=emp.EMPID,k2=emp.NAME} into g 
select new { EmpId = g.Key.k1, Name = g.Key.k2 , Count = g.Count()} 

Или вы могли бы просто использовать внутреннее соединение, чтобы начать с - но я не понимаю, текущая группировка достаточно хорошо посмотрите, что вы пытаетесь сделать. Что является ваш group by статья для?

РЕДАКТИРОВАТЬ: Если бы это было действительно просто группировать работником, вы уже это делаете. Вы можете изменить код на:

from emp in container.Employees 
join p in container.Vacancies 
on emp.EMPID equals p.ResponsibleOfficer into j 
where j.Any() 
select new { Employee = emp, Count = j.Count()} 

В принципе, после того, как join у вас есть две переменные диапазона в объеме: emp («текущий» сотрудника) и j (все соответствующие вакансии, соответствующие этому сотруднику). Вы просто пытаетесь подсчитать j для каждого сотрудника, не так ли?

+0

хорошо, может быть, я не понимаю linq достаточно хорошо. Я использую группу, чтобы сгруппировать свой результат с помощью EMPID и NAME, чтобы я мог подсчитать вакансии для каждой из комбинаций, или так, я думаю, что делаю. не могли бы вы объяснить, почему это неправильно и как можно написать внутреннее соединение? Благодарю. Я постараюсь ответить на один из вопросов, которые будут отвечать завтра в офисе, не могу проверить это на Linux дома. – kfc

+0

@kfc: Какую «комбинацию» вы имеете в виду? Разве вы не просто группируете сотрудников, в конечном счете? В этом случае вам вообще не нужна группа. Я отредактирую для этого ... –

+0

отлично. именно то, что мне нужно. Мне нужно будет узнать больше о linq. Я предположил, что должен был объединиться один. благодаря – kfc

0

Я использую лямбда, но работает:

container 
    .Employees 
    .Join(container.Vacancies, l => l.EmpId, e => e.ResponsibleOfficer, (l, e) => new { l.EmpId, l.Name }) 
    .GroupBy(g => new { g.EmpId, g.Name }) 
    .Select(s => new { EmpId = s.Key.EmpId, Name = s.Key.Name, Count = s.Count() }); 
Смежные вопросы