Sql server 使用Linq到实体的多重连接

Sql server 使用Linq到实体的多重连接,sql-server,linq,join,linq-to-entities,inner-join,Sql Server,Linq,Join,Linq To Entities,Inner Join,我想将以下SQL查询写入Linq to实体查询 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 =

我想将以下SQL查询写入Linq to实体查询

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 query=RepoTable1.AsQueryable(); [some query=query.Where(…)

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

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

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

最终答案:

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
   };

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

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

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
   };

我讨厌LINQ中的左连接,但我可以为您解释其中的一些。
(I,e)
应该是
(e,I)
,基于您先前使用
e
来参考表1,使用
I
来参考表2。接下来,您不应该打断查询,因为最终返回不是(不应该?)可以是表1中包含的记录,或者您需要将查询第二部分的结果放入另一个变量中返回
IQueryable
,您的最终查询不应该返回该值。您的最终查询应该返回一些匿名类型的IQueryable,其中包括表1、表2和表3中的所有字段。我倾向于认为Linq中连接的方法语法是最糟糕的编写方法之一。您尝试过在查询语法中编写它吗x?生成的查询语法与您已有的SQL非常相似。联接很好,左侧联接很难看。我更希望联接只需要额外的lamda,以便您在不匹配的情况下填写您想要返回的内容。类似于
.Join(内部、外部、内部键、MatchLamda、LeftOnlyLamda、righOnlyLaMDA)
类似于
Table1.Join(Table2,t1=>t1.id,t2=>t2.id,(t1,t2)=>new{Name=t1.Name,Address=t2.Address},(t1,t2)=>new{Name=null,Address=t2.Address})对于完全外部连接,请避免在LINQ中使用显式连接(到实体)。始终尝试使用导航属性。我讨厌LINQ中的左联接,但我可以为您解释其中的一些。
(I,e)
应该是
(e,I)
,这是基于您以前使用
e
引用表1和
I
引用表2的情况。接下来,您不应该中断查询,因为最终返回值不是(不应该?)只是表1中包含的记录,或者您需要将查询第二部分的结果放入另一个变量中。换一种方式考虑,
ReportTable1.AsQueryable()
返回
IQueryable
,您的最终查询不应该返回该值。您的最终查询应该返回一些匿名类型的IQueryable,其中包括表1、表2和表3中的所有字段。我倾向于认为Linq中连接的方法语法是最糟糕的编写方法之一。您尝试过在查询语法中编写它吗x?生成的查询语法与您已有的SQL非常相似。联接很好,左侧联接很难看。我更希望联接只需要额外的lamda,以便您在不匹配的情况下填写您想要返回的内容。类似于
.Join(内部、外部、内部键、MatchLamda、LeftOnlyLamda、righOnlyLaMDA)
类似于
Table1.Join(Table2,t1=>t1.id,t2=>t2.id,(t1,t2)=>new{Name=t1.Name,Address=t2.Address},(t1,t2)=>new{Name=null,Address=t2.Address})对于完全外部连接,请避免在LINQ中使用显式连接(到实体)。始终尝试使用导航属性。这很完美,谢谢。我使用了IQueryable类型的变量“query”而不是RepoTable1.AsQueryable()。但是现在我不需要将我的Linq to Entity查询与新的Linq to SQL查询“合并”。尝试这样做,但如果您有任何建议…这很完美,谢谢。我使用了变量“query”类型为IQueryable而不是RepoTable1.AsQueryable()。但是现在我不需要将我的Linq到实体查询与新的Linq到SQL查询“合并”。正在尝试这样做,但如果您有任何建议。。。