2012-07-25 58 views
0

請不要使用lamba響應。我發現了類似的線程,但仍然需要幫助。linq2sql加入不在另一個表中的選擇數據

我試圖顯示員工表中不是當前選定經理的僱員的名稱。

我的兩個SQL表的結構是這樣,但是這是假的數據

Employees: 
      pk  name  
      1  bob 
      2  sam 
      3  greg 
      4  kip 
      5  jill 
      6  kelly 
      7  chris 


ExpenseTeamMembers: 

      pk  expMgrPk  empPk  
      1   7   2 
      2   7   5 
      3   7   1 
      4   3   6 
      5   3   4 

因此,如果當前選中(經理變量)爲3我想所有empPks的名字在僱員表中除對於6,4.(凱利,基普)現在unselectedEmps = sam,jill,bob而不是僱員表中所有其他5個名字。

var unselectedEmps = (from u in db.employees 
         join o in db.expenseTeamMembers on u.pk equals o.empPk 
         where o.expMgrPk != mgr 
         select u.name).ToList(); 

       lstAvailable.DataSource = unselectedEmps; 

回答

1

我們廣泛的討論之後,我想你想要的是這個。

from u in db.Employees 
where !(from e in db.ExpenseTeamMembers 
     where e.expMgrPk == selectedMgr.pk 
     select e.empPk).Contains(u.pk) 
select u.Name 
+0

最上面的一個不起作用。它仍在檢索我不想要的記錄。外部聯接工作,但它正在輸出{name =在每個記錄前面。有沒有辦法解決這個問題?謝謝!! – 2012-07-25 04:54:13

+1

@ osiris355現在嘗試一下,使用修改後的最終選擇。 – Bert 2012-07-25 05:13:59

+0

謝謝你的作品! – 2012-07-25 14:31:22

1

的問題是,你正在做內部聯接,當你真正需要一個左外連接

this SO question

+0

在sr.DefaultIfEmpty仍然得到同樣的結果與VAR unselectedEmps =(從u在db.employees 加盟澳在u.pk db.expenseTeamMembers等於o.empPk到SR 從X( ) 其中x.expMgrPk!= mgr select u.name).ToList(); – 2012-07-25 02:45:05

+0

我認爲你想交換訂單,你想要員工的一切,所以應該在第二現場,費用團隊成員應該先去 – 2012-07-25 02:52:18

+0

沒有相同的結果。 var unselectedEmps =(from from o in db.expenseTeamMembers 將o.empPk上的db.employe中的u加入到sr.DefaultIfEmpty()中的sr 中,其中o.expMgrPk!= mgr select x.name) .ToList(); – 2012-07-25 02:57:11

1

我試過以下,它給出了正確的輸出。請您嘗試一下:

List<Employees> emps = new List<Employees>(); 
     emps.Add(new Employees { PK = 1, Name = "bob" }); 
     emps.Add(new Employees { PK = 2, Name = "sam" }); 
     emps.Add(new Employees { PK = 3, Name = "greg" }); 
     emps.Add(new Employees { PK = 4, Name = "kip" }); 
     emps.Add(new Employees { PK = 5, Name = "jill" }); 
     emps.Add(new Employees { PK = 6, Name = "kelly" }); 
     emps.Add(new Employees { PK = 7, Name = "chris" }); 

     List<ExpenseTeamMembers> etm = new List<ExpenseTeamMembers>(); 
     etm.Add(new ExpenseTeamMembers { empPK = 2, ExpMgrPK = 7, PK = 1 }); 
     etm.Add(new ExpenseTeamMembers { empPK = 5, ExpMgrPK = 7, PK = 2 }); 
     etm.Add(new ExpenseTeamMembers { empPK = 1, ExpMgrPK = 7, PK = 3 }); 
     etm.Add(new ExpenseTeamMembers { empPK = 6, ExpMgrPK = 3, PK = 4 }); 
     etm.Add(new ExpenseTeamMembers { empPK = 4, ExpMgrPK = 3, PK = 5 }); 

     var query = from t in 
         (
          from emp in emps 
          join o in etm on emp.PK equals o.empPK into j 
          from k in j.DefaultIfEmpty() 
          select new { Name = k == null ? string.Empty : emp.Name }) 
        where t.Name != string.Empty 
        select t.Name; 
+0

我沒有使用集合。我正在使用sql數據 – 2012-07-25 04:36:49

+1

我已經採集集合來顯示如何寫入查詢。您可以用db.Employee等替換emps。 – Umesh 2012-07-25 05:50:10

+0

我試圖讓你的代碼工作,但我有一些問題。由於我正在尋找PK的不需要我把string.empty弄到一些如何檢查一個整數?我也沒有看到這將如何工作考慮沒有檢查費用經理 – 2012-07-26 23:57:56

相關問題