Linq to SQL多个左外连接

时间:2016-08-04 21:33:37

标签: c# sql sql-server entity-framework linq-to-sql

好的,我在这里有点绝望,需要一些帮助。我对SQL很有经验,但对Linq to SQL和EF没有经验。我有一个概念验证查询,可以很好地对抗DB,但是当我尝试将它写入Linq to SQL时,它不能生成我需要的东西。

SELECT P.*, C.*, A.*
FROM Parent P
LEFT OUTER JOIN Access A
ON  (A.Field1 IS NULL OR A.Field1 = P.Field1)
AND (A.Field2 IS NULL OR A.Field2 = P.Field2)
AND (A.Field3 IS NULL OR A.Field3 = P.Field3)
AND A.AccessId = 123
LEFT OUTER JOIN Child ON 
C.Id = P.Id
AND A.HasAccess = 1

请注意第一个外部联接的最后一行:     AND A.AccessId = 123

这是必要的。我必须能够在这里插入一个值,而不是其他地方。

另请注意最后一个外部联接的最后一行:     AND A.HasAccess = 1

还需要控制谁可以看到该数据。

最后,linq看起来像这样。请理解这是从真实交易中抽象出来的,所以我可能会犯一些错误。我无法在此处发布实际查询。

from p in db.Parent
join a in db.Access 
on 123 equals a.AccessId into a1
from a2 in a1.Where(
    w => (!w.Field1.HasValue || w.Field1 == p.Field1)
      && (!w.Field2.HasValue || w.Field2 == p.Field2)
      && (!w.Field3.HasValue || w.Field3 == p.Field3)
).DefaultIfEmpty()
join c in db.Child on p.Id equals c.Id into c1
from c2 in c1.Where(
    w => c.HasAccess.HasValue && c.HasAccess.Value
).DefaultIfEmpty()
select new { ... stuff ... }

[进一步编辑以反映其他地方的答案。伙计,这东西不直观......:/]

当然,这创建的查询不必要地大,并且由于上述原因,我无法在此处发布。因此,如果有人可以帮助至少接近概念查询,那将非常感激。

1 个答案:

答案 0 :(得分:0)

好的,找到了这个问题的答案,这不是我的想法。我上面提交的解决方案是正确的,但我的逻辑中的一个微妙缺陷使我无法意识到这一点。不幸的是,我现在正处理一个新问题。稍后会发布一个问题。