두 개의 오브젝트 (테이블) A와 B를 조인해야합니다. 모든 A에 대해 0에서 많은 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 단계에서 모든 키를 선택하고 조인합니다. 그러나 "조인 절에있는 식 중 하나의 형식이 잘못되었습니다. 유형 추론에 실패했습니다. 'GroupJoin'에 대한 호출. " 가입에
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 = 주소. 나는 단지 하나의 주소를 가진 모든 고객을 원할 것입니다. 주소가 존재한다면 그렇지 않으면 청구서 수신 주소가 될 것입니다 ... –