2014-11-13 12 views
5

Ho una domanda sul rendimento di LINQ con un foreach su entità interrogabili da Entity Framework.È richiesta lista quando si utilizza foreach con LINQ alle entità

è meglio (e più veloce) per effettuare una

foreach(var thing in myentities.GetThemAll()) 

o

foreach(var thing in myentities.GetThemAll().ToList()) 

Sarà il primo esempio effettivamente causare myentities.GetThemAll().Count() (+1?) Viaggi al database ogni raccolta di una riga ?

risposta

5

È meglio, se devi solo scorrere i tuoi elementi per non chiamare ToList(). Questo perché quando lo chiamiamo, viene avviata un'esecuzione immediata della query corrispondente e verrà creata una raccolta in memoria.

Se non si chiama ToList si evita la creazione della raccolta in memoria che manterrà i risultati della query.

O segui la prima, o la seconda, effettuerai un viaggio di andata e ritorno nel database.

+0

Quindi, se faccio solo un foreach su una query di entità, farà ancora una sola query (per recuperare tutti i risultati), quindi eseguirà un'iterazione su di essi in memoria anziché tornare al database per ogni risultato? – Chris

+0

@Chris sì, esattamente. – Christos

+0

Grazie per l'intuizione, ma come si combina questa domanda che afferma il contrario? http://stackoverflow.com/questions/3575886/slow-foreach-on-a-linq-query-tolist-boosts-performance-immensely-why-is – Chris

2

C'è un equilibrio da colpire qui, e dipende dal contesto.

Il primo flussi i risultati dal database, in modo da non caricare tutto in memoria in una sola volta, questo è un bene se avete solo bisogno di iterare una volta, e clienti sanno che hanno a che fare con qualcosa che proviene da il database. Salva in memoria e tempo di esecuzione iniziale.

Con ToList() eseguirà la query completa e caricherà ogni elemento in memoria prima di eseguire il foreach. Questo è buono nel modo in cui si ha accesso ai dati su tutti in un colpo solo, il che potrebbe essere utile se si farà riferimento alle numerose volte enumerabili all'interno del metodo o non si desidera mantenere la connessione aperta a lungo.

Se la memoria è un problema, andare per il primo, altrimenti è probabilmente più semplice utilizzare ToList() quando si ha a che fare con un framework di entità al di fuori di un repository.

Problemi correlati