C# Linq到Sql在两个独立的内部联接之间进行左外部联接

C# Linq到Sql在两个独立的内部联接之间进行左外部联接,c#,entity-framework,linq-to-sql,C#,Entity Framework,Linq To Sql,正在尝试从Linq到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 ( pa

正在尝试从Linq到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应返回如下内容:

parentA    childA    parentB    childB
=======    ======    =======    ======
John       Dave      Paul       Mark
Jim        John      (null)     (null)
因此,换言之:

如何让两个独立的内部联接与一个左外部联接链接在一起,这样即使该城镇不存在B记录,我仍然可以从城镇123获取a记录?

这应该适用于IQueryable for enumerable您应该添加空检查

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中的一个属性,但您需要为此发布EF配置。

我的配置可能会有所帮助。非常感谢,Filip。我现在可以得到我想要的结果集了。我唯一注意到的是生成的SQL为ptBGroup创建了SELECT语句,而我原始消息中的SQL没有。我想知道生成的SQL中的SELECT语句是否会影响性能?还感谢您使用的变量名。。。左,…组。对理解有很大帮助。@NeilW我不认为这会对性能产生影响,但我不确定。如果希望获得最高性能,可能需要在查询上运行探查器,但我认为查询优化器可以处理这个问题。如果您在这方面有重大问题,我认为您需要运行原始sql,但我认为不需要。