Saluti, ho la seguente domanda. Non ho trovato la risposta esatta per questo, ed è davvero interessante per me. Supponiamo di avere il seguente codice che recupera i record dal database (per esportarlo in un file XML, ad esempio).LINQ è pigro-valutato?
var result = from emps in dc.Employees
where emps.age > 21
select emps;
foreach (var emp in result) {
// Append this record in suitable format to the end of XML file
}
Supponiamo che ci sia un milione di record che soddisfano la dove condizione nel codice. Cosa accadrà? Tutti questi dati verranno recuperati immediatamente da SQL Server nella memoria di runtime quando raggiungono il valore foreach, oppure verranno recuperati quindi necessari, il primo record, secondo. In altre parole, LINQ gestisce davvero la situazione con iterazioni attraverso raccolte di grandi dimensioni (vedi il mio post qui per i dettagli)?
In caso negativo, come superare i problemi di memoria in questo caso? Se ho davvero bisogno di attraversare la grande collezione, cosa dovrei fare? Calcola la quantità effettiva di elementi nella raccolta con l'aiuto della funzione Conteggio e successivamente legge i dati dal database con piccole parti. C'è un modo semplice per implementare il paging con il framework LINQ?
+1 Uso una funzione quasi identica per fare ciò. – alex
Non penso che i maggiori risultati per SQL Server rappresentino un problema di prestazioni così grande, se impostiamo correttamente le dimensioni della pagina. Dovrebbe essere circa 1000 di righe per il mio esempio, penso, e quando l'applicazione sarà principalmente occupata con l'esportazione, non con l'interrogazione del database. –
@ Spirit_1984 - Sono d'accordo con te. Preferirei avere più hit su SQL Server che tentare di caricare milioni di righe in memoria. –