2011-12-16 9 views
5

Sto lavorando con Entity Framework per un po 'ma ho ancora alcuni "buchi neri" con come funziona sotto il cofano. Anche dopo aver letto un paio di articoli non sono sicuro che la mia comprensione sia corretta.Comprensione EF sotto il cofano. Include vs Joins


Iniziamo con le domande:

  • Come EF Includere sta lavorando sotto il cofano?
  • Quali sono le differenze tra Join e Include?
  • Problemi di prestazioni con Includi (caricamento lazy loading vs eager, query SQL generate, ecc.)?
  • Quando dovrei usare Join invece Includere e viceversa?

risposta

9

Quando si esegue una query su EF tramite espressioni linq o lambda, sono necessarie solo istruzioni di join se lo schema sottostante non fornisce FK e quindi non si dispone di proprietà di navigazione sugli oggetti.

Dall'altro lato, l'inclusione (caricamento ansioso) e il caricamento lento possono funzionare solo se sono presenti FK, perché utilizzano le proprietà di navigazione.

Lo sql sottostante in entrambi i casi utilizzerà i join (poiché sql non ha il concetto di "proprietà di navigazione").

Per quanto riguarda le prestazioni, dipende dalle situazioni. Il caricamento lento rispetto al caricamento Eager (quindi nello scenario FK) può essere una scelta difficile.

Di solito vado con caricamento lento, utile quando si dispone di un grande risultato principale, ma è necessario "unire" solo i dati di alcuni elementi dell'intero set di risultati.

Se si sa che avrete bisogno dei dati di join dell'intero set di risultati, il carico impaziente potrebbe essere migliore per le prestazioni. Suggerirei di sperimentare e vedere di persona.

+0

Grazie per la risposta, ma ancora bisogno di qualcosa di più preciso. –

+0

Cosa succede se si dispone di proprietà di navigazione aggiunte manualmente senza chiavi esterne sottostanti. Includerà il lavoro come previsto o no? – Dan

Problemi correlati