2012-07-25 56 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

相关问题