結合
今日は結合の基本的なものを試してみました。
MSDNだと、このあたりで説明されています。
暗黙的な外部結合
関連をたどると外部結合のクエリが発行されます。JPAとは違ってますね。JPAのJPQLでは関連をたどると内部結合になったはず。結合とは関係ないけど、where句では「=」ではなく「==」を使います。SQLだと思って書くと間違えます。
void 暗黙的な外部結合() { var employees = from e in db.Employee where e.Department.DepartmentName == "SALES" select e; foreach (var e in employees) { Console.WriteLine(e.EmployeeName); } }
内部結合
「join」を使うと内部結合になります。結合条件のon句では「=」ではなく「equals」でつなげます。SQLだと思って書くと間違えます。
void 内部結合() { var employees = from e in db.Employee join d in db.Department on e.DepartmentId equals d.DepartmentId select e; foreach(var e in employees) { Console.WriteLine(e.EmployeeName); } }
明示的な外部結合
明示的に外部結合する場合は、「into 」を使って一旦別の変数?で受けて、DefaultIfEmpty()を呼び出してさらに別の変数?で受けないといけないみたい。
void 明示的な外部結合() { var employees = from e in db.Employee join d in db.Department on e.DepartmentId equals d.DepartmentId into joinedDepts from joinedDept in joinedDepts.DefaultIfEmpty() select e; foreach (var e in employees) { Console.WriteLine(e.EmployeeName); } }
明示的な外部結合2
3つ以上のテーブルを外部結合するとごちゃごちゃしますね。SQLのほうがまだすっきり書けるような。。。
void 明示的な外部結合2() { var employees = from e in db.Employee join d in db.Department on e.DepartmentId equals d.DepartmentId into joinedDepts from joinedDept in joinedDepts.DefaultIfEmpty() join a in db.Address on e.AddressId equals a.AddressId into joninedAddresses from joninedAddress in joninedAddresses.DefaultIfEmpty() select e; foreach (var e in employees) { Console.WriteLine(e.EmployeeName); } }