【问题标题】:linq2sql join select data that is not in another tablelinq2sql join 选择不在另一个表中的数据
【发布时间】:2012-07-23 10:03:22
【问题描述】:

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

我正在尝试显示员工表中不属于当前所选经理的员工的姓名。

我的两个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,我想获取员工表中除 6、4 之外的所有 empPks 的名称。(kelly,kip)现在 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;

【问题讨论】:

    标签: c# sql winforms c#-4.0 linq-to-sql


    【解决方案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
    

    【讨论】:

    • 最上面的不工作。它仍在检索我不想要的记录。外连接有效,但它在每条记录前输出 {name= 。有没有办法在不解析的情况下摆脱它?谢谢!!
    • @osiris355 立即尝试,使用修改后的最终选择。
    • @osiris355 我一直在玩 LinqPad 中的查询、添加员工、更换经理等,而且它似乎每次都对我有用。这意味着问题可能出在其他地方,或者我不完全理解。更改数据源后,您是否缺少 DataBind?要进一步探索它,我真的需要查看更多代码。
    • @osiris355 您可以将其压缩并通过电子邮件发送到我个人资料中的任一地址。我可能要到明天才能看到它。
    • @osiris355 查看当前答案或您的电子邮件。
    【解决方案2】:

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

    this SO question

    【讨论】:

    • 仍然得到相同的结果与 var unselectedEmps = (from u in db.employees join o in db.expenseTeamMembers on u.pk 等于 o.empPk into sr from x in sr.DefaultIfEmpty() where x. expMgrPk != mgr select u.name).ToList();
    • 我想你想交换订单,你想要员工的一切,所以应该排在第二位,费用团队成员应该先去
    • 没有相同的结果。 var unselectedEmps = (from o in db.expenseTeamMembers join u in db.employees on o.empPk 等于 u.pk into sr from x in sr.DefaultIfEmpty() where o.expMgrPk != mgr select x.name).ToList() ;
    • 即使我现在删除了 where 子句,它仍然只搜索 feeTeamMembers 表而不搜索 employees 表
    【解决方案3】:

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

    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;
    

    【讨论】:

    • 我没有使用收藏。我正在使用 sql 数据
    • 我收集的只是为了展示如何编写查询。您可以用 db.Employee 等替换 emps。
    • 我正在尝试让您的代码正常工作,但我遇到了一些问题。由于我正在搜索 pk,所以我不需要将 string.empty 与一些如何检查整数有关?另外,考虑到没有检查费用经理,我不知道这将如何工作
    猜你喜欢
    • 2016-07-22
    • 2012-04-04
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    相关资源
    最近更新 更多