使用 LINQ 使 1 个表联接到其他 2 个表上

本文关键字:其他 LINQ 使用 | 更新日期: 2023-09-27 18:34:30

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

我可以让它在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 表中,我有一些关于工人主管的额外信息,这就是我需要的信息。

使用 LINQ 使 1 个表联接到其他 2 个表上

假设所有联接都基于外键,您应该能够执行以下操作,这些外键应在实体中产生导航属性。 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
              };