使用 Linq to Entity 进行多重连接

Multiple Join with Linq to Entity

我想将以下 SQL 查询写入 Linq To Entity 查询。

SELECT *
FROM Table1
LEFT JOIN Table2 ON Table2.IdTable1 = Table1.Id
INNER JOIN Table3 ON Table3.IdTable2 = Table2.Id

SELECT *
FROM Table1
LEFT JOIN Table2 ON Table2.IdTable1 = Table1.Id
LEFT JOIN Table3 ON Table3.IdTable2 = Table2.Id
WHERE Table3.Id IS NULL

对于第一个,我正在研究这个: var 查询 = RepoTable1.AsQueryable(); [一些查询 = query.Where(...)

query = query
  .Join(RepoTable2.AsQueryable(), e => e.IdTable1, i => i.Id, (i, e) => i)
  .GroupJoin(RepoTable3.AsQueryable(), c => c.IdTable2, eq => eq.Id, (eq, c) => eq);

关于加入,我有些不明白。 实际上,"eq => eq.Id" 应该是 "Table2" 类型,但它是 "Table1"。 如果我将“(i, e) => i”更改为“(i, e) => e”,我会收到编译错误,因为 "query" 正在等待 "Table1" 类型。

对于第二个查询,我不知道如何将 "Where()" 添加到 Join(实际上,我大部分时间都在使用第一个查询)

提前致谢!如果这还不够清楚,请告诉我!

最终答案:

query = (from t1 in query
join t2 in RepoTable2.AsQueryable() on t1.Id equals t2.IdTable1 into joint1t2
from t2 in joint1t2.DefaultIfEmpty() // DefaultIfEmpty is used for left joins
join t3 in RepoTable3.AsQueryable() on t2.Id equals t3.IdT
select t1);

第二个查询:

query = (from t1 in query
join t2 in RepoTable2.AsQueryable() on t1.Id equals t2.IdTable1 into joint1t2
from t2 in joint1t2.DefaultIfEmpty() // DefaultIfEmpty is used for left joins
join t3 in RepoTable3.AsQueryable() on t2.Id equals t3.IdTable2 into joint2t3
from t3 in joint2t3.DefaultIfEmpty() // DefaultIfEmpty is used for left joins
where t3.Id== null
select t1);

我建议使用查询语法(如果您不能使用导航属性)

使用此语法,您的第一个查询看起来会非常相似

var query =
   from t1 in RepoTable1.AsQueryable()
   join t2 in RepoTable2.AsQueryable() on t1.Id equals t2.Id into t2g
   from t2 in t2g.DefaultIfEmpty() //DefaultIfEmpty is used for left joins
   join t3 in RepoTable3.AsQueryable() on t2.Id equals t3.Id
   select new 
   {
    t1, t2, t3
   };