A group join breaks up the joined table into sequences of objects each matching/corresponding to an object from the other table. In your example, when you use the join/into you are performing a group join. All the order objects associated with a given customer are collected into a separate collection that you have named 'customerOrders'. This is similar to how a GroupBy works, except a GroupBy doesn't join two tables, it turns a single table into a sequence of keys each paired with a collection of matching objects in that group.
For example, if I were to use a GroupBy with the OrderTable, I could group the orders by customer.
var q = from o in db.OrderTable
group o.OrderID by o.CustomerID into g
select new {Customer = g.Key, Orders = g};
what I get is this:
Customer Orders
------------- --------
1 1
2
3
2 4
This is not a normal SQL Group By. A LINQ GroupBy creates a heirarchy. Every item resulting from the GroupBy has a Key value and a sequence. The sequence (or group) value is a collection with zero or more items.
A Group Join is very much like a Join and a Group By smashed together. A SQL join takes two tables, performs a cartesian product, filters it and produces a resulting table. A Group Join takes two tables and forms a pairing of left hand side objects (keys) and sequences of right-hand side matching objects (groups).
var q - from c in db.CustomerTable
join o in db.OrderTable on c.CustomerID equals o.CustomerID into g
select new {Customer = c.CustomerName, Order = g.Select(o => o.OrderID) };
Customer Orders
--------------- ----------
John 1
2
3
Jerry 4