La paginación ha aparecido en ejemplos en varias secciones anteriores y ahora la explicaremos en detalle.
Hay tres formas de lograrlo:
1. Método superior (int topCount)
En sqlserver y msaccess, en realidad es superior, y en Oracle, se implementa a través de rownum.
2. Desde (int índice inicial, int índice final)
El número de registros desde la barra startIndex hasta la barra endIndex.
3. Página (int tamaño de página, int índice de página)
tamaño de página por página, índice de página
A continuación se muestran ejemplos de estos tres métodos por turno.
método superior:
DbSession.Default.From<Productos>()
.arriba(10)
.ToList(); Esta consulta consulta los primeros 10 registros en la tabla de productos. La declaración SQL generada es la siguiente: (Cómo generar el SQL generado por el componente de visualización).
Texto: SELECCIONE TOP 10 * DE [Productos]
del método:
DbSession.Default.From<Productos>()
.De(3, 8)
.ToList(); busca datos del elemento 3 al elemento 8 (incluidos los elementos 3 y 8). La declaración SQL generada es la siguiente:
Texto: SELECCIONAR * DE ( SELECCIONAR LOS 6 PRINCIPALES * DE ( SELECCIONAR LOS 8 PRINCIPALES * DE [Productos] ORDENAR POR [Productos].[IDProducto] ASC) COMO tempIntable ORDENAR POR [IDProducto] DESC) COMO tempOuttable ORDENAR POR [IDProducto] ASC
método de página:
DbSession.Default.From<Productos>()
.Página(10, 2)
.ToList(); Consulta los datos en la página 2 de 10 elementos por página. La declaración SQL es la siguiente:
Texto: SELECCIONAR * DE ( SELECCIONAR LOS 10 PRINCIPALES * DE ( SELECCIONAR LOS 20 PRINCIPALES * DE [Productos] ORDENAR POR [Productos].[IDProducto] ASC) COMO tempIntable ORDENAR POR [IDProducto] DESC) COMO tempOuttable ORDENAR POR [IDProducto] ASC
Se puede ver que las declaraciones SQL generadas por el método from y el método de página tienen el mismo formato. De hecho, el método de página finalmente llama al método de.
Si el parámetro startIndex de from es igual a 1, se llamará al método superior para realizar la consulta.
De forma predeterminada, no configuramos una clasificación. El componente agregará automáticamente una clasificación. Si hay una clave principal, elija la clasificación por clave principal; de lo contrario, elija otra columna para ordenar.
Por supuesto, en muchos casos necesitamos establecer qué columnas ordenar.
Por ejemplo:
DbSession.Default.From<Productos>()
.Página(10, 2)
.OrderBy(Productos._.PrecioUnitario.Desc)
.Dónde(Productos._.IDCategoría == 2)
.ToList(); La condición de consulta es que el ID de categoría sea igual a 2, ordenado por precio unitario al revés, y hay 10 datos en la página 2 por página.
El sql generado es el siguiente:
Texto: SELECCIONAR * DE ( SELECCIONAR LOS 2 PRINCIPALES * DE [Productos] DONDE [Productos]. [ID de categoría] = @bee7551993404c8592f07f9b01710bb5 ORDENAR POR [Productos].[Precio unitario] ASC) AS temp_table ORDENAR POR [Precio unitario] DESC Parámetros: @bee7551993404c859 710bb5[ Int32] = 2 ¿Es inesperada esta declaración SQL? Resulta que la segunda página de la consulta que cumple con las condiciones solo tiene 2 datos, por lo que al realizar la consulta, simplemente use precio unitario en orden positivo los 2 primeros y listo.
Eliminemos la condición y echemos un vistazo:
DbSession.Default.From<Productos>()
.Página(10, 2)
.OrderBy(Productos._.PrecioUnitario.Desc)
//.Dónde(Productos._.IDCategoría == 2)
.ToList(); El sql generado es el siguiente:
Texto: SELECCIONAR * DE ( SELECCIONAR LOS 10 PRINCIPALES * DE ( SELECCIONAR LOS 20 PRINCIPALES * DE [Productos] ORDENAR POR [Productos].[Precio unitario] DESC) COMO tempIntable ORDENAR POR [Precio unitario] ASC) COMO tempOuttable ORDENAR POR [Precio unitario] DESC Esto es El formato generado normal ya está disponible.
Todos los scripts SQL anteriores se generan en SQL Server2000.
De hecho, durante el proceso de consulta, el establecimiento también consultará automáticamente el número de registros que cumplen las condiciones (), por lo que en el caso de big data, la eficiencia no será muy buena.
Si la base de datos que configuró es SQL Server2005, no se consultará el recuento, sino que se consultará directamente a través de número_fila () para obtener una mayor eficiencia. (Oracle se implementa mediante rownum)
Aquí hay un ejemplo de SQL Server2005:
DbSession.Default.From<Productos>()
.Página(10, 2)
.OrderBy(Productos._.PrecioUnitario.Desc)
//.Dónde(Productos._.CategoríaID == 2)
.ToList(); El código sigue siendo el mismo que el del ejemplo anterior y el sql generado es:
Texto: SELECT * FROM ( SELECT *,row_number() over( ORDER BY [Productos].[UnitPrice] DESC) AS tmp__rowid FROM [Productos] ) AS tmp_table DONDE (tmp__rowid ENTRE 11 Y 20) La llamada al método sigue siendo la misma, entonces, si el parámetro startIndex de from es igual a 1, top todavía se usa primero y row_numer() no se usa.
Por supuesto, si cree que la paginación no es lo suficientemente ideal, puede escribir SQL o procedimientos almacenados usted mismo.