2012-09-05 14 views

risposta

23

Un Incluso è destinato a conservare le strutture e i grafici dell'oggetto originale. Un join è necessario per proiettare una rappresentazione appiattita del grafico dell'oggetto o per unire tipi che non sono correlati in modo naturale attraverso il grafico (ad esempio, unire la città del cliente con la città di una struttura di spedizione).

Confrontare il seguente: db.Customers.Include("Orders") Genera un oggetto grafico come questo:

Customer 
    Order 
    Order 
    Order 

Al contrario, se si fa la stessa cosa con un join proietta in un tipo anonimo si potrebbe ottenere il seguente:

from c in db.Customers 
join o in db.Orders on c.CustomerId equals o.CustomerId 
select new {c, o} 

// produces new Anonymous<Customer, Order> 

Mentre entrambi possono inviare la stessa richiesta al database, il tipo risultante potrebbe essere molto diverso.

+1

ma è il risultato lo stesso ed è quando è consigliabile utilizzare. Includi contro un join –

+1

No, il join produce un tipo anonimo (TResult) tramite SelectMany . l'Includi produce TSource con TCollection caricato avidamente anziché caricato pigro. –

9

In un certo senso, sì. Includi è implementato come join. A seconda del nullability del link incluso è un join interno o sinistro.

È sempre possibile costruire un include corpo utilizzando una join, come questo:

db.Users.Select(u => new { u, u.City }) 

si tratta di un "include" per la città dell'utente. Si manifesta come un join SQL.

+0

Ciao, puoi vedere http://stackoverflow.com/q/18809817/859154? riguarda qualcosa che hai detto qui nella tua risposta. –