2016-08-04 192 views
-1

好吧,我有點絕望在這裏,需要一些幫助。我對SQL有經驗,但對Linq to SQL和EF沒有經驗。我有一個概念驗證查詢,對數據庫工作正常,但是當我嘗試將它寫入Linq to SQL時,它不會生成我所需要的內容。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 

請注意,第一外的最後一行加入: 和A.AccessId = 123

這是必要的。我必須能夠在這裏插入一個值,而不是在其他地方。

還要注意最後一個外的最後一行加入: 和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 ... } 

[進一步編輯以反映SO上其他地方的答案。男人,這東西不直觀...:/]

當然,這造成的查詢是不必要的大,並且,由於上述原因,我不能在這裏發佈它。所以,如果有人能幫助至少接近概念性的查詢,那將不勝感激。

回答

0

好吧,找到了這個問題的答案,這不是我想的。我上面提交的解決方案是正確的,但是我邏輯中的一個微妙缺陷使我無法意識到這一點。不幸的是,我現在正在處理一個新問題。稍後會發佈一個問題。