Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
跟随linq执行左外连接而不是内连接_Linq_C# 4.0_Inner Join - Fatal编程技术网

跟随linq执行左外连接而不是内连接

跟随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}

我看不出以下代码的问题所在。我试图找回那些被指定为某些假期责任人的员工。我的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} 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。我想我必须一个人去分组。谢谢