¿Dapper's IEnumerable? han diferido o la ejecución inmediata?

c# dapper deferred-execution ienumerable orm

Pregunta

Cuando ejecuto una consulta en Dapper y solo quiero recuperar un bloque de registros, ¿puedo usar .Skip (). Take (), o necesito usar seleccionar top n * en el SQL?

por ejemplo, una tabla con 10.000 registros y solo quiero los primeros 200 porque mi página de lista solo muestra 200 por página. ¿Funciono esto?

conn.Query<Widget>("select * from Widgets").Skip((page - 1) * size).Take(size);

O esto:

conn.Query<Widget>("select top 200 * from Widgets");

¿El .Query<T> Dapper se ha .Query<T> o no?

Respuesta aceptada

Deberías usar SELECT TOP n...

El método Query<T> tiene un parámetro opcional bool buffered = true , que cuando true pasa por todo el conjunto de resultados, lee cada fila en una List<T> . Podría hacer que este parámetro fuera falso, y el IEnumerable<T> resultante sería "diferido" en el sentido de que la consulta db no se ejecutaría hasta que la use, y las filas se recuperarían del lado db "una a la vez". "(llama a IDataReader.Read en cada iteración).

Entonces, sí, puede ser "diferido". SIN EMBARGO, aún debe usar TOP n porque de lo contrario todavía ejecutará y preparará el conjunto de resultados para 10000 registros en el lado db, aunque puede transportar únicamente las primeras n filas de esos al cliente.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué