C# linq2sql联接选择不在另一个表中的数据

C# linq2sql联接选择不在另一个表中的数据,c#,sql,winforms,c#-4.0,linq-to-sql,C#,Sql,Winforms,C# 4.0,Linq To Sql,请不要使用lamba回复。我已经找到了类似的线索,但仍然需要帮助 我试图显示employees表中不是当前所选经理的员工的姓名 我的两个sql表的结构如下,但这是假的数据 Employees: pk name 1 bob 2 sam 3 greg 4 kip 5 jill

请不要使用lamba回复。我已经找到了类似的线索,但仍然需要帮助

我试图显示employees表中不是当前所选经理的员工的姓名

我的两个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
因此,如果当前选择的(mgr变量)为3,我希望获得employees表中除6、4之外的所有EMPK的名称。(凯利,基普)现在取消选中emps=sam,jill,bob,而不是employees表中的所有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;

问题是,当您实际需要左外连接时,您正在进行内部连接


请参见

问题在于,当您实际需要左外连接时,您正在进行内部连接


经过我们的长时间讨论,我想你想要的是这个

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

经过长时间的讨论,我想你想要的是这个

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

我尝试了以下方法,它给出了正确的输出。请尝试一下:

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;
List emps=new List();
emps.Add(新员工{PK=1,Name=“bob”});
emps.Add(新员工{PK=2,Name=“sam”});
emps.Add(新员工{PK=3,Name=“greg”});
emps.Add(新员工{PK=4,Name=“kip”});
emps.Add(新员工{PK=5,Name=“jill”});
emps.Add(新员工{PK=6,Name=“kelly”});
emps.Add(新员工{PK=7,Name=“chris”});
列表etm=新列表();
添加(新的ExpenseTeamMembers{empk=2,ExpMgrPK=7,PK=1});
添加(新的ExpenseTeamMembers{empk=5,ExpMgrPK=7,PK=2});
添加(新的ExpenseTeamMembers{empk=1,ExpMgrPK=7,PK=3});
添加(新的ExpenseTeamMembers{empk=6,ExpMgrPK=3,PK=4});
添加(新的ExpenseTeamMembers{empk=4,ExpMgrPK=3,PK=5});
var query=from t in
(
来自emp中的emp
将o加入emp上的etm。PK等于将o.empk加入j
来自j.DefaultIfEmpty()中的k
选择新{Name=k==null?string.Empty:emp.Name})
哪里有t.Name!=字符串。空
选择t.名称;

我尝试了以下方法,它给出了正确的输出。请尝试一下:

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;
List emps=new List();
emps.Add(新员工{PK=1,Name=“bob”});
emps.Add(新员工{PK=2,Name=“sam”});
emps.Add(新员工{PK=3,Name=“greg”});
emps.Add(新员工{PK=4,Name=“kip”});
emps.Add(新员工{PK=5,Name=“jill”});
emps.Add(新员工{PK=6,Name=“kelly”});
emps.Add(新员工{PK=7,Name=“chris”});
列表etm=新列表();
添加(新的ExpenseTeamMembers{empk=2,ExpMgrPK=7,PK=1});
添加(新的ExpenseTeamMembers{empk=5,ExpMgrPK=7,PK=2});
添加(新的ExpenseTeamMembers{empk=1,ExpMgrPK=7,PK=3});
添加(新的ExpenseTeamMembers{empk=6,ExpMgrPK=3,PK=4});
添加(新的ExpenseTeamMembers{empk=4,ExpMgrPK=3,PK=5});
var query=from t in
(
来自emp中的emp
将o加入emp上的etm。PK等于将o.empk加入j
来自j.DefaultIfEmpty()中的k
选择新{Name=k==null?string.Empty:emp.Name})
哪里有t.Name!=字符串。空
选择t.名称;

仍然使用var unselectedEmps=(从db.employees中的u加入到db.expenseTeamMembers中的o.pk等于从sr.DefaultIfEmpty()中的x加入到sr中的o.empk,其中x.expMgrPk!=mgr选择u.name)。ToList();我认为你想交换订单,你想从员工那里得到一切,所以应该排在第二位,expenseTeamMembers应该排在第一位没有相同的结果。var unselectedEmps=(从db.expenseTeamMembers中的o加入到db.empPk中的u.employees等于从sr.DefaultIfEmpty()中的x加入到sr中的u.pk,其中o.expMgrPk!=mgr select x.name).ToList();即使我现在删除where子句,它仍然只搜索expenseTeamMembers表而不搜索employees表,直到得到与var unselectedEmps=(从db.employees中的u加入到db.expenseTeamMembers中的o在u.pk上等于o.EMPK从sr.DefaultIfEmpty()中的x加入到sr中,其中x.expMgrPk!=mgr选择u.name)。ToList();我认为您需要交换订单,您需要员工的一切,因此应排在第二位,expenseTeamMembers应排在第一位没有相同的结果。var unselectedEmps=(从db.expenseTeamMembers中的o加入到db.empPk中的u.employees等于从sr.DefaultIfEmpty()中的x加入到sr中,其中o.expMgrPk!=mgr选择x.name)。ToList();即使我现在删除where子句,它仍然只搜索expenseTeamMembers表而不是employees表。我没有使用集合。我正在使用sql数据。我使用集合只是为了显示如何编写查询。您可以用db.Employee等替换EMP。我正在尝试让您的代码正常工作,但我没有NG有些问题。既然我正在寻找PK,我不需要去检查字符串。空到一些如何检查一个整数?