C# Linq2SQL中多个联接的结果不正确

C# Linq2SQL中多个联接的结果不正确,c#,sql,sql-server,join,linq-to-sql,C#,Sql,Sql Server,Join,Linq To Sql,我的任务是将一些老掉牙的SQL转换为Linq2SQL,我知道这不应该是第一选择,但需要这样做 问题 我一直在尝试强制特定的连接来复制所需的输出,下面是SQL的简化版本,其中显示了一个参数变量,后面是我在Linq2SQL中尝试的简化版本。表1中可能会查询几个备选字段,因此在转换代码中使用q和q2,尽管实际参数与问题无关 目标 查询需要从表1中检索相关行,从表2中检索最新的相关行,并从表2的父表表3中检索附加数据,最好在一次传递中检索 表1中可能有0-n个匹配项,表1与表2之间有1:n的关系,其中有

我的任务是将一些老掉牙的SQL转换为Linq2SQL,我知道这不应该是第一选择,但需要这样做

问题

我一直在尝试强制特定的连接来复制所需的输出,下面是SQL的简化版本,其中显示了一个参数变量,后面是我在Linq2SQL中尝试的简化版本。表1中可能会查询几个备选字段,因此在转换代码中使用q和q2,尽管实际参数与问题无关

目标

查询需要从表1中检索相关行,从表2中检索最新的相关行,并从表2的父表表3中检索附加数据,最好在一次传递中检索

表1中可能有0-n个匹配项,表1与表2之间有1:n的关系,其中有0-n行,表3与表2之间有1:n的关系

无论我如何构造表达式,linq都会生成表2中的内部联接(不包括表1中的行),如何构造linq查询以获得所需的结果

SELECT      [...]
FROM        Table1 t1
LEFT JOIN   (
                SELECT      MAX(id) AS id, parent_id 
                FROM        Table2  
                GROUP BY    parent_id 
            ) x2 ON t1.id = x2.parent_id 
LEFT JOIN   Table2  t2  ON x2.id = t2.id 
LEFT JOIN   Table3  t3  ON t2.table3_id = t3.id 
WHERE       t1.id = row_id

以下是我使用配方规则的翻译:

var Q1 = from t2 in dc.Table2
         group t2 by t2.parent_id into t2g
         select new { parent_id = t2g.Key, id = t2g.Max(t2 => t2.id) };

var Q2 = from t1 in Table1
         where t1.id == row_id
         join q1 in Q1 on t1.id equals q1.parent_id into q1j
         from q1 in q1j.DefaultIfEmpty()
         join t2 in dc.Table2 on q1.id equals t2.id into t2j
         from t2 in t2j.DefaultIfEmpty()
         join t3 in dc.Table3 on t2.table3_id equals t3.id into t3j
         from t3 in t3j.DefaultIfEmpty()
         select new { t1, t2, t3 };

也许我的食谱能帮到你。太棒了,做得很好,我能看出我做错了什么,再加上你的食谱规则,剩下的我会更有信心,谢谢!
var Q1 = from t2 in dc.Table2
         group t2 by t2.parent_id into t2g
         select new { parent_id = t2g.Key, id = t2g.Max(t2 => t2.id) };

var Q2 = from t1 in Table1
         where t1.id == row_id
         join q1 in Q1 on t1.id equals q1.parent_id into q1j
         from q1 in q1j.DefaultIfEmpty()
         join t2 in dc.Table2 on q1.id equals t2.id into t2j
         from t2 in t2j.DefaultIfEmpty()
         join t3 in dc.Table3 on t2.table3_id equals t3.id into t3j
         from t3 in t3j.DefaultIfEmpty()
         select new { t1, t2, t3 };