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回以上、使用できるの知らなかった・・・






Users Today : 18
Users Yesterday : 34
Users Last 7 days : 185
Users Last 30 days : 817
Users This Month : 364
Users This Year : 2826
Total Users : 97341
Views Today : 26
Views Yesterday : 40
Views Last 7 days : 252
Views Last 30 days : 1048
Views This Month : 487
Views This Year : 3409
Total views : 135855
Who's Online : 0