私は2つのオブジェクト(テーブル)AとBを結合する必要があります。任意のAについては、0〜多くのBがあります。クエリは、Aごとに1つの行を返す必要があります。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'への呼び出し。 " 「新しい{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行の行が1行または複数回取得され、その行に接続され、WHERE条件を満たします。 .. –
@Stefan:あなたに答えを投稿しました。 – sgtz
@MichaelSagalovichそれは奇妙に聞こえるかもしれませんが、目的が何であるか説明していないのです。 A =顧客およびB =住所。私はすべての顧客が1つの住所しか持たない場合は住宅住所が存在する場合はそれを、それ以外の場合は住所を指定します。 –