グループ化結合

外部結合を実現するために使ったinto式と組み合わせたjoin句ですが、これはグループ化結合というらしいです。
MSDNの説明

グループ化結合の例

どうもDepartmentを左側に持ってきたほうがわかりやすいかも。
匿名型を使わずに書いてみました。

IQueryable<IEnumerable<Employee>> query = 
    from d in db.Department
    join e in db.Employee
    on d.DepartmentId equals e.DepartmentId into x
    select x;

foreach (IEnumerable<Employee> employees in query)
{
    foreach (Employee employee in employees)
    {
        Console.WriteLine(employee.EmployeeName);
    }
}

LINQの結果が IQueryable> という型になりますが、いってみれば、

  • 内側のIEnumerable は 同じ部署IDに関連付けられた従業員のコレクション
  • IQueryable> は「同じ部署IDに関連付けられた従業員のコレクション」のコレクション。要素数は部署の数。

ということになると思います。
従業員が部署でグループ化されたってことですね。

発行されたSQLはこんなんでした。

SELECT [t1].[EmployeeId], [t1].[EmployeeNo], [t1].[EmployeeName], [t1].[ManagerId], 
[t1].[Hiredate], [t1].[Salary], [t1].[DepartmentId], [t1].[AddressId], [t1].[Version], 
    (
    SELECT COUNT(*)
    FROM [dbo].[Employee] AS [t2]
    WHERE [t0].[DepartmentId] = [t2].[DepartmentId]
    ) AS [value]
FROM [dbo].[Department] AS [t0]
LEFT OUTER JOIN [dbo].[Employee] AS [t1] ON [t0].[DepartmentId] = [t1].[DepartmentId]
ORDER BY [t0].[DepartmentId], [t1].[EmployeeId]