グループ化結合
外部結合を実現するために使った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]