Ho provato a fare molte ricerche ma sono più un db - quindi anche la spiegazione nel MSDN non ha alcun senso per me. Qualcuno può spiegare, e fornire alcuni esempi su quale sia l'affermazione Include()
nel termine della query SQL
?Cosa fa Include() in LINQ?
risposta
Diciamo per esempio si desidera ottenere un elenco di tutti i clienti:
var customers = context.Customers.ToList();
E supponiamo che ogni oggetto Customer
ha un riferimento alla sua serie di Orders
, e che ogni Order
ha riferimenti a LineItems
che può anche fare riferimento a Product
.
Come si può vedere, la selezione di un oggetto di livello superiore con molte entità correlate può portare a una query che richiede l'inserimento di dati da più origini. Come misura di prestazione, Include()
consente di indicare quali entità correlate devono essere lette dal database come parte della stessa query.
Utilizzando lo stesso esempio, questo potrebbe portare in tutte le relative intestazioni di ordine, ma nessuno degli altri record:
var customersWithOrderDetail = context.Customers.Include("Orders").ToList();
Come punto finale dal momento che hai chiesto per SQL, la prima istruzione, senza Include()
poteva generare una semplice dichiarazione:
SELECT * FROM Customers;
La dichiarazione finale che chiama Include("Orders")
può apparire come segue:
SELECT *
FROM Customers JOIN Orders ON Customers.Id = Orders.CustomerId;
Grazie. Usando il tuo esempio, posso dire se voglio includere anche 'LineItems' e' Products', la query LINQ dovrebbe assomigliare a questa: 'var customersWithOrderDetail = context.Customers.Include (" Orders "). Include (" LineItems ") .Include ("Prodotti"). ToList(); '? –
Sì, è possibile concatenare più chiamate a 'Include()' per acquisire oggetti lungo la differenza "percorsi". Se vuoi oggetti nello stesso percorso devi solo fare una chiamata che specifica l'intero percorso. Dato che 'LineItems' e' Products' non condividono alcun componente di percorso che hai bisogno di chiamate separate. – Yuck
È obbligatorio utilizzare Includi? Sono abbastanza sicuro che ho lavorato su soluzioni in cui ho potuto ottenere oggetti correlati senza usarlo. – Jepzen
Volevo solo aggiungere che "Include" è parte del caricamento di eager. È descritto nel tutorial di Entity Framework 6 di Microsoft. Ecco il link: https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-application
Estratto dalla pagina collegata:
Qui ci sono diversi modi in cui l'Entity Framework può caricare i dati relativi nelle proprietà di navigazione di un'entità:
Caricamento lento. Quando l'entità viene letta per la prima volta, i dati relativi non vengono recuperati. Tuttavia, la prima volta che si tenta di accedere a una proprietà di navigazione, i dati richiesti per tale proprietà di navigazione vengono recuperati automaticamente. Ciò si traduce in più query inviate al database: una per l'entità stessa e una ogni volta che i dati correlati per l'entità devono essere recuperati. La classe DbContext abilita il caricamento lento per impostazione predefinita.
Eager caricamento. Quando l'entità viene letta, i relativi dati vengono recuperati insieme ad essa. In genere, ciò comporta una singola query di join che recupera tutti i dati necessari. Si specifica il caricamento impaziente utilizzando il metodo
Include
.Caricamento esplicito. Questo è simile al caricamento lazy, tranne che si recupera esplicitamente i dati relativi nel codice; non accade automaticamente quando accedi a una proprietà di navigazione. Si caricano manualmente i dati correlati recuperando la voce di gestione stato oggetto per un'entità e chiamando il metodo Collection.Load per le raccolte o il riferimento.Carica il metodo per le proprietà che contengono una singola entità. (Nell'esempio seguente, se si desidera caricare la proprietà di navigazione Amministratore, si sostituirà
Collection(x => x.Courses)
conReference(x => x.Administrator)
.) In genere si utilizzerà il caricamento esplicito solo quando si è scaricato il caricamento lento.Poiché non recuperano immediatamente i valori delle proprietà, il caricamento lazy e il caricamento esplicito sono entrambi noti anche come caricamento differito.
Benvenuti in SO =) Solo un suggerimento, ma quando si risponde a qualcosa del genere, se è possibile, includere un frammento di codice. I collegamenti possono morire purtroppo. –
@The_Cthulhu_Kid infatti, ecco [proof] (http://cdn.duelinganalogs.com/wp-content/uploads/2014/11/Dead-Link.png). – Noctis
Pensate ad esso come imporre Eager-Loading in uno scenario in cui gli elementi secondari sarebbero altrimenti caricati in modo pigro.
L'EF di query che invia al database produrrà un risultato più ampio all'inizio, ma all'accesso non verranno effettuate query di follow-up quando si accede agli articoli inclusi.
D'altra parte, senza di esso, EF eseguirà query separate successivamente, quando si accede per la prima volta agli elementi secondari.
Molto semplice, so solo semplice Selezionare, dove, Ordina per, alcuni operatori di aggregazione. Non ho provato JOIN in LINQ, né Includi. Il mio obiettivo finale era di poter riscrivere queste query LINQ in SQL –