以下linq执行左外连接而不是内连接

时间:2013-05-08 18:57:09

标签: linq c#-4.0 inner-join

我无法通过以下代码查看问题所在。我正在努力找回那些被指定为某些职位空缺负责人的员工。我的数据库中有大约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

非常感谢任何帮助。感谢

2 个答案:

答案 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() });