2013-05-08 57 views
0

我看不到問題出在哪裏,下面的代碼。我試圖找回那些被指定爲空缺職位負責人的員工。我的DB中約有20個空缺分配給了約16名員工,員工表中約有1801名員工記錄。代碼總是返回一個包含1801個條目的結果。以下linq執行左外連接而不是內連接

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

請注意預覽當你張貼問題,並試圖很好地格式化您的文章。我編輯了查詢以避免不幸的縮進。 – 2013-05-08 18:59:42

回答

1

您正在使用join ... into。對於原始序列的每個元素,即使沒有正確序列中的匹配,總是會返回單個結果。

您可以使用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()} 

或者你可以只使用一個內連接下手 - 但是我不明白你目前的分組不夠好看看你想做什麼。什麼你的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,對吧?

+0

好的,也許我不太瞭解linq。我正在使用group by來對EMPID和NAME的結果進行分組,因此我可以計算每個組合的空位,或者我認爲我在做。你能解釋一下爲什麼它是錯誤的,以及如何編寫內部連接?謝謝。我將在辦公室明確回答明天的問題,不能在家裏在linux上測試這個問題。 – kfc 2013-05-08 21:04:58

+0

@kfc:你的意思是什麼「組合」?你不是真的只是由員工分組嗎?在這種情況下,你根本不需要'group by'。我會爲此編輯... – 2013-05-08 21:05:54

+0

太棒了。正是我需要的。我需要閱讀更多關於linq的信息。我以爲我必須自己組隊。謝謝 – kfc 2013-05-09 08:43:42

0

我使用的λ,但工程:

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