結合

今日は結合の基本的なものを試してみました。
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);
    }
}