LINQ to SQLに触れる機会があったので、調べたことを残しておきます。
INNER JOIN
var q = db.Table1.Join(
db.Table2,
t1 => t1.key,
t2 => t2.key,
(t1,t2) => {
t1.id,
t2.id
});
LEFT JOIN
var q = db.Table1.GroupJoin(
db.Table2,
t1 => t1.key,
t2 => t2.key,
(t1,t2) => {
t1,
t2
}).SelectMany(
x => x.t2.DefaultIfEmpty(),
(t1,t2) => {
t1.t1.id,
t2.id.
}
);
複数のキーで結合する方法
// 複数のキーで結合する場合
var q = db.Table1.Join(
db.Table2,
t1 => new { t1.key1 , t1.key2 },
t2 => new { t2.key1 , t2.key2 },
(t1,t2) => {
t1.id,
t2.id
});
キーの列名が違う場合は、列名と順序を揃えないといけないようです。
// 複数のキーで結合する場合(列名が違う場合)
var q = db.Table1.Join(
db.Table2,
t1 => new { key1 = t1.keyA , key2 = t1.keyB },
t2 => new { key1 = t2.keyC , key2 = t2.keyD },
(t1,t2) => {
t1.id,
t2.id
});
注意点
なぜかは知りませんが、OrderBy()の後にDistinct()を使用すると、ORDER BYが効かなくなるみたいです。
Distinct()の後にOrderBy()を使用すれば、DISTINCTもORDER BY も効きました。