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 配置。
正在尝试从 Linq-To-Sql
生成以下 SQLSELECT
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 配置。