Saludos, Tengo la siguiente pregunta. No encontré la respuesta exacta para eso, y es realmente interesante para mí. Supongamos que tengo el siguiente código que recupera los registros de la base de datos (para exportarlo a un archivo XML, por ejemplo).¿LINQ es evaluado de forma diferida?
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
}
Supongamos que hay un millón de registros que satisfacen la condición donde en el código. ¿Lo que sucederá? Todos estos datos se recuperarán de SQL Server de inmediato en la memoria de tiempo de ejecución cuando llegue al foreach constructo, o se recuperará entonces necesario, el primer registro, segundo. En otras palabras, ¿LINQ realmente maneja la situación al iterar a través de grandes colecciones (ver mi post aquí para más detalles)?
Si no, ¿cómo solucionar los problemas de memoria en ese caso? Si realmente necesito atravesar la gran colección, ¿qué debo hacer? Calcule la cantidad real de elementos en la colección con la ayuda de la función Contar, y luego lea los datos de la base de datos en pequeñas porciones. ¿Hay alguna manera fácil de implementar paginación con LINQ framework?
+1 Uso una función casi idéntica para hacer esto. – alex
No creo que más visitas a SQL Server supongan un problema de rendimiento tan grande si configuramos el tamaño de página correctamente. Debería estar alrededor de 1000 filas para mi ejemplo, creo, y cuando la aplicación estará principalmente ocupada con la exportación, no con consultar la base de datos. –
@ Spirit_1984 - Estoy de acuerdo contigo. Prefiero tener más visitas a SQL Server que intentar cargar millones de filas en la memoria. –