我需要連接兩個對象(表格)A和B.對於任何A,可以有多個B到零。該查詢需要每A返回一行。如何使用Linq執行「複雜」連接
B我想在連接之前訂購,以便能夠根據特定條件從B中選擇所需的行。說B有一個列類型。如果有類型1,那麼這就是我需要的B,如果不是的話:類型2必須被選中,等等。
現在我考慮一下,我不知道我會如何去T-sql。 我覺得是這樣的:
SELECT A.*
FROM A LEFT JOIN (
SELECT * FROM B AS B1 WHERE B1.Type = (SELECT TOP 1 B2.Type FROM B AS B2
WHERE B2.JoinID = B1.JoinID
ORDER BY B2.Type)
) AS B ON B.JoinID = A.JoinID
[編輯]
隨着sgtz的答案我試圖使其工作。如果因爲我想訂購的字段不存在而必須再做一個步驟。我在步驟1中添加此字段,在步驟2中,我選擇了鍵並在步驟3中加入了所有內容,但在那裏收到錯誤「join子句中的某個表達式的類型不正確。對'GroupJoin'的呼叫。「關於加入「在新的{b.TopRelatieID adressen1加入......」
var adressen1 = from a in db.Adres
select new
{
RelatieAdres = a,
Sortering = (int)(a.AdresType.Code == codeVestAdres ?
1 : a.AdresType.Code == codePostAdres ?
2 : (100 + (int)a.AdresType.Code.ToCharArray()[0]))
};
var adressen2 = from b in adressen1
group b by new { RelatieID = b.RelatieAdres.RelatieID } into p
let TopAdresType = p.Min(at => at.Sortering)
select new { TopRelatieID = p.Key.RelatieID, TopAdresType };
var q = from k in db.Klants
join b in adressen2 on k.RelatieID equals b.TopRelatieID into b_join
from b in b_join.DefaultIfEmpty()
join a in adressen1 on new { b.TopRelatieID, b.TopAdresType } equals new { a.RelatieAdres.RelatieID, a.Sortering } into a_join
from a in a_join.DefaultIfEmpty()
使用這個查詢,你只會返回A中所有的行,每個行只有一次或多次,因爲有來自B的行,它們與那行相連並滿足你的WHERE條件,這看起來很奇怪。 .. –
@Stefan:爲你發佈了一個答案。 – sgtz
@MichaelSagalovich這聽起來很奇怪,但如果我解釋目的是什麼,那不是。 A =客戶和B =地址。我希望所有的客戶只有一個地址,這將是住房地址,如果存在,否則帳單地址,否則... –