我无法通过以下代码查看问题所在。我正在努力找回那些被指定为某些职位空缺负责人的员工。我的数据库中有大约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
非常感谢任何帮助。感谢
答案 0 :(得分: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
,对吗?
答案 1 :(得分: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() });