2016-02-12 68 views
0

我试图用LINQ将2个表连接到另外2个表上,但我似乎无法弄清楚这是如何完成的。使用LINQ在2个其他表上进行1表连接

我可以使它在Visual Studio中编写纯SQL语句,我只是不确定如何将其转换为LINQ。

这里是我的SQL语句:

SELECT c.CustomerId, c.CustomerName, pw.Number, pc.Number FROM Customers as c 
LEFT JOIN Tasks as k ON k.Id = c.Task_Id 
LEFT JOIN Workers as w ON w.Id = k.Worker_Id 
LEFT JOIN PersonNumbers as pw ON pw.Person_Id = w.Id 
LEFT JOIN Chiefs as ch ON ch.Id = k.Chief_Id 
LEFT JOIN PersonNumbers as pc ON pc.Person_Id = ch.Id 

也许这需要一些解释。

我们有一堆客户和这些客户可以有一些任务。在一项任务中,您将有工作人员负责人。在PersonNumbers表中,我有一些关于工作人员首长的一些额外信息,这是我需要的信息。

任何帮助表示赞赏!提前致谢。

+1

这是一个简单的查询,您应该使用能够把它写在LINQ [这](https://msdn.microsoft.com/en-us/library/bb397927.aspx)。 –

+0

类似的实现检查是否有帮助http://stackoverflow.com/questions/5571861/joining-two-tables-using-linq – Maverick

+1

你可以在Linq中使用'join',但最好使用导航属性,假设你的实体拥有他们。 https://coding.abel.nu/2012/06/dont-use-linqs-join-navigate/ – juharr

回答

1

假设你所有的连接都是基于外键的,你应该可以做如下的事情,这些外键会导致实体的导航属性。 DefaultIfEmpty是什么使所有的东西左加入。

var results = from c in db.Customers 
       from k in c.Tasks.DefaultIfEmpty() 
       from w in k.Workers.DefaultIfEmpty() 
       from pw in w.Persons.DefaultIfEmpty() 
       from ch in k.Chiefs.DefaultIfEmpty() 
       from pc in ch.Persons.DefaultIfEmpty() 
       select new 
       { 
        c.CustomerId, 
        c.CustomerName, 
        pw.Number, 
        pc.Number 
       }; 

如果您没有导航属性,那么您将不得不使用join

var results = from c in db.Customers 
       join xk in db.Tasks on xk.Id equals c.Task_Id 
       from k in xk.DefaultIfEmpty() 
       join xw in db.Workers on xw.Id equals k.Worker_Id 
       from w in xw.DefaultIfEmpty() 
       join xpw in db.Persons on xpw.Person_Id equals w.Id 
       from pw in xpw.DefaultIfEmpty() 
       join xch in db.Chiefs on xch.Id equals k.Chief_Id 
       from ch in xch.DefaultIfEmpty() 
       join xpc in db.Persons on xpc.Person_Id euals ch.Id 
       from pc in xpc.DefaultIfEmpty() 
       select new 
       { 
        c.CustomerId, 
        c.CustomerName, 
        pw.Number, 
        pc.Number 
       }; 
相关问题