Пейджинг появлялся в примерах в нескольких предыдущих разделах, и теперь мы объясним его подробно.
Есть три способа добиться этого:
1. Метод Top(int topCount)
В sqlserver и msaccess это вообще-то топ, а в Oracle это реализовано через rownum.
2. From(int startIndex, int endIndex)
Количество записей от панели startIndex до панели endIndex.
3. Страница(int pageSize, int pageIndex)
pageSize на страницу, pageIndex
Ниже приведены примеры этих трех методов по очереди.
верхний метод:
DbSession.Default.From<Продукты>()
.Вверх(10)
.ToList(); Этот запрос запрашивает первые 10 записей в таблице продуктов. Сгенерированный оператор sql выглядит следующим образом: (Как вывести sql, сгенерированный компонентом просмотра).
Текст: ВЫБЕРИТЕ ТОП-10 * ИЗ [Продукты]
из метода:
DbSession.Default.From<Продукты>()
.Из(3, 8)
.ToList() ищет данные от элемента 3 до элемента 8 (включая элементы 3 и 8). Сгенерированный оператор SQL выглядит следующим образом:
Текст: SELECT * FROM ( SELECT TOP 6 * FROM ( SELECT TOP 8 * FROM [Продукты] ORDER BY [Products].[ProductID] ASC) AS tempIntable ORDER BY [ProductID] DESC) AS tempOuttable ORDER BY [ProductID] ASC
метод страницы:
DbSession.Default.From<Продукты>()
.Пейдж(10, 2)
.ToList(); Запрос данных на странице 2 по 10 элементов на странице. Оператор sql выглядит следующим образом:
Текст: SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 20 * FROM [Продукты] ORDER BY [Products].[ProductID] ASC) AS tempIntable ORDER BY [ProductID] DESC) AS tempOuttable ORDER BY [ProductID] ASC
Видно, что операторы SQL, созданные методом from и методом страницы, имеют одинаковый формат. Фактически, метод страницы в конечном итоге вызывает метод from.
Если параметр startIndex from равен 1, для запроса будет вызван верхний метод.
По умолчанию мы не устанавливаем сортировку. Компонент автоматически добавит сортировку. Если существует первичный ключ, выберите сортировку по первичному ключу, в противном случае выберите другой столбец для сортировки.
Конечно, во многих случаях нам нужно указать, какие столбцы сортировать.
Например:
DbSession.Default.From<Продукты>()
.Пейдж(10, 2)
.OrderBy(Products._.UnitPrice.Desc)
.Где(Продукты._.CategoryID == 2)
.ToList(); Условие запроса: идентификатор категории равен 2, отсортирован по цене единицы в обратном направлении, и на странице 2 содержится 10 данных на каждой странице.
Сгенерированный sql выглядит следующим образом:
Текст: SELECT * FROM ( SELECT TOP 2 * FROM [Продукты] WHERE [Продукты].[CategoryID] = @bee7551993404c8592f07f9b01710bb5 ORDER BY [Products].[UnitPrice] ASC) AS temp_table ORDER BY [UnitPrice] DESC Параметры: @bee7551993404c8 59 2f07f9b01710bb5[ Int32 ] = 2 Является ли этот оператор sql неожиданным? Оказывается, вторая страница запроса, соответствующая условиям, содержит только 2 фрагмента данных, поэтому при запросе просто используйте unitprice в положительном порядке сверху 2, и все готово.
Давайте удалим условие и посмотрим:
DbSession.Default.From<Продукты>()
.Пейдж(10, 2)
.OrderBy(Products._.UnitPrice.Desc)
//.Где(Продукты._.CategoryID == 2)
.ToList(); Сгенерированный SQL-код выглядит следующим образом:
Текст: SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 20 * FROM [Products] ORDER BY [Products].[UnitPrice] DESC) AS tempIntable ORDER BY [UnitPrice] ASC) AS tempOuttable ORDER BY [UnitPrice] DESC Это Теперь доступен обычный сгенерированный формат.
Все приведенные выше сценарии sql созданы под управлением sql server2000.
Фактически, в процессе запроса учреждение также автоматически запрашивает count() количество записей, соответствующих условиям, поэтому в случае больших данных эффективность будет не очень хорошей.
Если вы настроили базу данных sql server2005, счетчик не будет запрашиваться, а будет запрошен напрямую через row_number() для повышения эффективности. (Oracle реализован rownum)
Вот пример sql server2005:
DbSession.Default.From<Продукты>()
.Пейдж(10, 2)
.OrderBy(Products._.UnitPrice.Desc)
//.Где(Продукты._.CategoryID == 2)
.ToList(); Код остается таким же, как в приведенном выше примере, и сгенерированный sql:
Текст: SELECT * FROM ( SELECT *,row_number() over( ORDER BY [Products].[UnitPrice] DESC) AS tmp__rowid FROM [Products] ) AS tmp_table WHERE (tmp__rowid BETWEEN 11 AND 20) Вызов метода остается прежним, поэтому, если параметр startIndex для from равен 1, сначала по-прежнему используется top, а row_numer() не используется.
Конечно, если вы считаете, что разбиение на страницы недостаточно идеально, вы можете написать SQL или хранимые процедуры самостоятельно.