Cross Join
var q = from c in categories join p in products on c equals p.Category select new { Category = c, p.ProductName };
Group Join
var q = from c in categories join p in products on c equals p.Category into ps select new { Category = c, Products = ps };
Left Outer Join
var q = from c in categories join p in products on c equals p.Category into ps from p in ps.DefaultIfEmpty() select new { Category = c, ProductName = p == null ? "(No products)" : p.ProductName };