C# Linq到Sql在两个独立的内部联接之间进行左外部联接
正在尝试从Linq到SQL生成以下SQLC# 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
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,但我认为不需要。