0

我看不到以下代码的问题所在。我正在尝试检索那些被指定为某些职位空缺负责人的员工。我的数据库中有大约 20 个空缺分配给大约 16 名员工,员工表中有大约 1801 条员工记录。该代码始终返回包含 1801 个条目的结果。

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

任何帮助深表感谢。谢谢

4

2 回答 2

1

你正在使用join ... into. 这将始终为原始序列的每个元素返回一个结果,即使在正确的序列中没有匹配项。

j您可以在usingwhere子句中过滤掉没有元素的条目:

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每个员工,对吧?

于 2013-05-08T19:02:31.680 回答
0

我正在使用 lambda,但可以:

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() });
于 2013-05-08T19:33:48.660 回答