Para estender a resposta da sintaxe da cadeia de expressão por Clever Human:
Se você quiser fazer coisas (como filtrar ou selecionar) nos campos de ambas as tabelas serem unidas - em vez de apenas uma dessas duas tabelas -, poderá criar um novo objeto na expressão lambda do parâmetro final para o método Join incorporando essas duas tabelas, por exemplo:
var dealerInfo = DealerContact.Join(Dealer,
dc => dc.DealerId,
d => d.DealerId,
(dc, d) => new { DealerContact = dc, Dealer = d })
.Where(dc_d => dc_d.Dealer.FirstName == "Glenn"
&& dc_d.DealerContact.City == "Chicago")
.Select(dc_d => new {
dc_d.Dealer.DealerID,
dc_d.Dealer.FirstName,
dc_d.Dealer.LastName,
dc_d.DealerContact.City,
dc_d.DealerContact.State });
A parte interessante é a expressão lambda na linha 4 desse exemplo:
(dc, d) => new { DealerContact = dc, Dealer = d }
... onde construímos um novo objeto do tipo anônimo que tem como propriedades os registros DealerContact e Dealer, juntamente com todos os seus campos.
Em seguida, podemos usar os campos desses registros à medida que filtramos e selecionamos os resultados, conforme demonstrado no restante do exemplo, que usa dc_d
como nome o objeto anônimo que construímos que possui os registros DealerContact e Dealer como suas propriedades.