Sto proiettando LINQ ai risultati SQL in classi fortemente tipizzate: padre e figlio. La differenza di prestazioni tra queste due domande è di grandi dimensioni:query LINQ proiettata uno a molti viene eseguita ripetutamente
query lente - la registrazione dal DataContext mostra che una chiamata separata al DB è stato fatto per ciascun genitore
var q = from p in parenttable
select new Parent()
{
id = p.id,
Children = (from c in childtable
where c.parentid = p.id
select c).ToList()
}
return q.ToList() //SLOW
veloce Query - accedendo dagli show DataContext una singola query colpo db che restituisce tutti i dati richiesti
var q = from p in parenttable
select new Parent()
{
id = p.id,
Children = from c in childtable
where c.parentid = p.id
select c
}
return q.ToList() //FAST
voglio forzare LINQ to utilizzare lo stile unico di query del secondo esempio, ma popolare le classi genitore con i propri figli oggetti direttamente. in caso contrario, la proprietà Children è una IQuerierable<Child>
che deve essere interrogata per esporre l'oggetto Child.
Le domande di riferimento non sembrano affrontare la mia situazione. l'uso di db.LoadOptions non funziona. forse richiede che il tipo sia un TEntity registrato con DataContext.
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Parent>(p => p.Children);
db.LoadOptions = options;
Si prega di notare: genitori e bambini sono tipi semplici, non Table<TEntity>
tipi. e non esiste una relazione contestuale tra genitore e figlio. le sottoquery sono ad-hoc.
The Crux of the Issue: nel secondo esempio LINQ attuo le istruzioni IQueriable
e non chiamo la funzione ToList()
e per qualche motivo LINQ sa come generare una singola query in grado di recuperare tutti i dati richiesti. Come faccio a popolare la mia proiezione ad-hoc con i dati effettivi come si ottiene nella prima query? Inoltre, se qualcuno potesse aiutarmi a esprimere meglio la mia domanda, lo apprezzerei.
Come "Bambino" può essere un "tipo semplice"? Dovrebbe essere un tipo mappato. Ed è 'parenttable' a' Table' o il risultato di una query linq precedente? Alcune istruzioni di linq possono far sì che L2S passi da unirsi a N + 1. –
Marcatori duplicati: conosci la differenza tra entity framework e linq in sql? –
@GertArnold Mentre la parte LINQ di EF/L2S spesso fa duplicare funzionalmente domande simili, in * questo * caso credo che tu sia del tutto corretto; non sono duplicati. Riapertura. –