C# Linq2SQL中多个联接的结果不正确
我的任务是将一些老掉牙的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查询以获得所需的结果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的关系,其中有
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 };