跟随linq执行左外连接而不是内连接
我看不出以下代码的问题所在。我试图找回那些被指定为某些假期责任人的员工。我的DB中有大约20个空缺分配给大约16名员工,员工表中有大约1801个员工记录。代码总是返回一个包含1801个条目的结果跟随linq执行左外连接而不是内连接,linq,c#-4.0,inner-join,Linq,C# 4.0,Inner Join,我看不出以下代码的问题所在。我试图找回那些被指定为某些假期责任人的员工。我的DB中有大约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}
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
非常感谢您的帮助。谢谢您正在使用
加入。。。进入
。这将始终为原始序列的每个元素返回一个结果,即使在正确的序列中没有匹配项
您可以使用where
子句筛选出j
中没有元素的条目:
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()}
或者你可以从一个内部连接开始——但我不太了解你当前的分组,不知道你想做什么。您的分组依据
条款是什么
编辑:如果只是按员工分组,那么您已经在这样做了。您可以将代码更改为:
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()}
基本上,在加入
后,范围内有两个范围变量:emp
(当前员工)和j
(与该员工匹配的所有相关空缺)。您只是想为每个员工计算j
,对吗?我使用的是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() });
当你发布问题时,请注意预览,并尽量将你的文章格式合理。我对查询进行了编辑,以避免出现不幸的缩进。好吧,也许我对linq理解不够。我使用group by将我的结果按EMPID和名称分组,这样我就可以计算每个组合的空缺,或者我认为我正在这样做。你能解释一下为什么它是错误的,以及如何写一个内部连接吗?谢谢明天我会在办公室把回答的问题标记出来,不能在家里用linux测试。@kfc:你说的“组合”是什么意思?你不是真的只是按员工分组吗?在这种情况下,您根本不需要分组依据
。我会编辑的…太好了。正是我需要的。我需要更多地了解linq。我想我必须一个人去分组。谢谢