使用 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 表中,我有一些关于工人和主管的额外信息,这就是我需要的信息。
假设所有联接都基于外键,您应该能够执行以下操作,这些外键应在实体中产生导航属性。 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
};