LINQで外部結合(LEFT OUTER JOIN)を行うためのメモ。
LINQで内部結合(LEFT INNER JOIN)を行うには、JOIN句を使って、以下のような感じで行えば良いのは良く例も出ているし、構文上も素直に納得できる。
(ちなみに、複数キーがある場合は、
new {t1.key1,t1.key2[,…]} equals new {t2.key1,t2.key2[,…]}
の形で指定する)
// Collection1とCollection2の[KEY]が同じものを結合
// 同じキーを含まないCollection1は集合から外される。
var q = from t1 in Collection1
join t2 in Collection2 on t2.[KEY] equals t1.[KEY]
・・・
では、外部結合(LEFT OUTER JOIN)、つまり、Collection1は全てのレコードが選択され、Collection2が存在しない場合は、t2をNULLとする)にはどのように表現するのが一番簡単か?
答えは意外なもので、以下のようなクエリを用いることでかなり簡単に実装可能である。
// Collection1とCollection2の[KEY]が同じものを結合
// ただし、Collection2と同じキーを持っていないCollection1も集合に含める
var q = from t1 in Collection1
from t2 in Collection2.Where(c=>c.[KEY] == t1.[KEY]).DefaultIfEmpty()
・・・
1つのクエリ中にfrom句を2回使用して、2つ目の集合は1つめのキーで絞込をかけ、さらに、そのキーを持つレコードが存在しない場合にはデフォルト値(null)を返すようにする。
つい最近まで、from句を2回以上、使用できるの知らなかった・・・