The code that you listed:
from c in company
from e in c.Employees
select e;
... will produce a list of every employee for every company in the company
variable. If an employee works for two companies, they will be included in the list twice.
The only "join" that might occur here is when you say c.Employees
. In an SQL-backed provider, this would translate to an inner join from the Company
table to the Employee
table.
However, the double-from
construct is often used to perform "joins" manually, like so:
from c in companies
from e in employees
where c.CompanyId == e.CompanyId
select e;
This would have a similar effect as the code you posted, with potential subtle differences depending on what the employees
variable contains. This would also be equivalent to the following join
:
from c in companies
join e in employees
on c.CompanyId equals e.CompanyId
select e;
If you wanted a Cartesian product, however, you could just remove the where
clause. (To make it worth anything, you'd probably want to change the select
slightly, too, though.)
from c in companies
from e in employees
select new {c, e};
This last query would give you every possible combination of company and employee.