Linq-to-Sql LEFT OUTER JOIN between 2 separate INNER JOINTS

Linq-to-Sql LEFT OUTER JOIN between 2 separate INNER JOINRS

正在尝试从 Linq-To-Sql

生成以下 SQL
SELECT 
parenttableA.Name AS parentA,
childtableA.Name AS childA,
parenttableB.Name AS parentB,
childtableB.Name AS childB

FROM parenttableA
INNER JOIN childtableA ON childtableA.parentid = parenttableA.id

LEFT OUTER JOIN

(
parenttableB
INNER JOIN childtableB ON childtableB.parentid = parenttableB.id
)

ON parenttableB.townid = parenttableA.townid

WHERE parenttableA.townid = 123

这个 SQL 应该 return 像这样:

parentA    childA    parentB    childB
=======    ======    =======    ======
John       Dave      Paul       Mark
Jim        John      (null)     (null)

所以,换句话说:

我如何将 2 个单独的内部联接与 LEFT OUTER JOIN 链接在一起,以便我仍然可以从城镇 123 获得 "A" 记录,即使该城镇不存在 "B" 记录?

这应该适用于 IQueryable 可枚举你应该添加 null 检查

var query = from ptA in parenttableA
            join ctA in childtableA on ptA.Id equals ctA.Id
            join ptBctB in (from ptB in parenttableB
                            join ctB in childtableB on ptB.Id equals ctB.Id
                            select new { ptB, ctB }) on ptA.TownId equals ptBctB.ptB.TownId into ptBGroup
            from ptBctBLeft in ptBGroup.DefaultIfEmpty()
            where ptA.TownId == 123
            select new
                   {
                       parentA = ptA.Name,
                       childA = ctA.Name,
                       parentB = ptBctBLeft.ptB.Name,
                       childB = ptBctBLeft.ctB.Name,
                   };

此外,我认为您可以仅通过映射配置来做到这一点,并将其作为 POCO 中的 属性,但您需要 post EF 配置。