kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 urini
urini
Вопрос

Как вернуть страницу результатов из SQL?

Во многих приложениях есть сетки, которые отображают данные из таблицы базы данных на одной странице. Многие из них также позволяют пользователю выбирать количество записей на странице, сортировать по любому столбцу и перемещаться вперед-назад по результатам.

Каким алгоритмом можно реализовать этот шаблон, не вынося всю таблицу на клиент и не фильтруя данные на клиенте. Как вывести на экран только те записи, которые вы хотите показать пользователю?

Упрощает ли LINQ это решение?

11 2008-08-13T18:38:02+00:00 8
Программирование
sql
linq
.net
pagination
Решение / Ответ
Michael Stum
Michael Stum
13-го августа 2008 в 6:40
2008-08-13T18:40:32+00:00
Дополнительно
Источник
Редактировать
#8416800

На MS SQL Server 2005 и выше, ROW_NUMBER(), кажется, работает:

T-SQL: Пейджинг с ROW_NUMBER()

DECLARE @PageNum AS INT;
DECLARE @PageSize AS INT;
SET @PageNum = 2;
SET @PageSize = 10;

WITH OrdersRN AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY OrderDate, OrderID) AS RowNum
          ,OrderID
          ,OrderDate
          ,CustomerID
          ,EmployeeID
      FROM dbo.Orders
)

SELECT * 
  FROM OrdersRN
 WHERE RowNum BETWEEN (@PageNum - 1) * @PageSize + 1 
                  AND @PageNum * @PageSize
 ORDER BY OrderDate
         ,OrderID;
11
0
Rory MacLeod
Rory MacLeod
13-го августа 2008 в 7:29
2008-08-13T19:29:28+00:00
Дополнительно
Источник
Редактировать
#8416803

I' d рекомендуют или использующий LINQ или пытаются скопировать то, что он делает. I' ve получил приложение, где я использую LINQ, Берут и методы Пропуска, чтобы восстановить пронумерованные страницы данные. Кодекс выглядит примерно так:

MyDataContext db = new MyDataContext();
var results = db.Products
    .Skip((pageNumber - 1) * pageSize)
    .Take(pageSize);

Управление Профилировщиком SQL-сервера показывает, что LINQ преобразовывает этот вопрос в SQL, подобный:

SELECT [ProductId], [Name], [Cost], and so on...
FROM (
    SELECT [ProductId], [Name], [Cost], [ROW_NUMBER]
    FROM (
       SELECT ROW_NUMBER() OVER (ORDER BY [Name]) AS [ROW_NUMBER], 
           [ProductId], [Name], [Cost]
       FROM [Products]
    )
    WHERE [ROW_NUMBER] BETWEEN 10 AND 20
)
ORDER BY [ROW_NUMBER]

Без обиняков:

  1. Отфильтруйте свои ряды и используйте функцию ROW_NUMBER, чтобы добавить номера ряда в заказе, который Вы хотите.
  2. Фильтр (1), чтобы возвратить только номера ряда Вы хотите на своей странице.
  3. Вид (2) номером ряда, который совпадает с заказом, который Вы хотели (в этом случае, по имени).
7
0
Lukas Eder
Lukas Eder
26-го октября 2013 в 6:32
2013-10-26T18:32:02+00:00
Дополнительно
Источник
Редактировать
#8416807

Есть по существу два способа сделать нумерацию страниц в базе данных (I' m принимающий you' ре используя SQL-сервер):

Используя ПОГАШЕНИЕ

Другие объяснили, как 'ROW_NUMBER () ПО ()' оценивающий функцию может использоваться, чтобы выполнить страницы. It' s стоящий упоминания, что SQL-сервер 2012 наконец включал поддержку стандарта SQL 'ПОГАШЕНИЕ.. ПРИНЕСИТЕ' пункт:

SELECT first_name, last_name, score
FROM players
ORDER BY score DESC
OFFSET 40 ROWS FETCH NEXT 10 ROWS ONLY

Если you' ре используя SQL-сервер, 2012 и назад-совместимость не проблема, Вы должны, вероятно, предпочесть этот пункт, поскольку это будет выполнено более оптимально SQL-сервером в угловых случаях.

Используя ИСКАТЬ метод

Есть совершенно различное, намного быстрее, но менее известный способ выполнить оповещение в SQL. Это часто называют " ищите method" как описано в это сообщение в блоге здесь.

SELECT TOP 10 first_name, last_name, score
FROM players
WHERE (score < @previousScore)
   OR (score = @previousScore AND player_id < @previousPlayerId)
ORDER BY score DESC, player_id DESC

'@previousScore' и ценности '@previousPlayerId' - соответствующие значения последнего отчета от предыдущей страницы. Это позволяет Вам приносить " next" страница. Если 'ЗАКАЗ' направлением - 'ASC', просто используйте '&gt'; вместо этого.

С вышеупомянутым методом Вы не можете немедленно подскочить до страницы 4 не сначала принеся предыдущие 40 отчетов. Но часто, Вы не хотите подскакивать это далеко так или иначе. Вместо этого Вы получаете намного более быстрый вопрос, который мог бы быть в состоянии принести данные в постоянное время, в зависимости от Вашей индексации. Плюс, Ваши страницы остаются " stable" неважно, если основные данные изменяются (например, на странице 1, в то время как you' ре на странице 4).

Это - лучший способ осуществить оповещение когда ленивая погрузка большего количества данных в веб-приложениях, например.

Отметьте, " ищите method" также назван [оповещением клавиатуры] (https://stackoverflow.com/a/3215973/521799).

 Community
Community
Редактировал ответ 23-го мая 2017 в 12:24
5
0
Adam Lassek
Adam Lassek
15-го августа 2008 в 10:07
2008-08-15T22:07:40+00:00
Дополнительно
Источник
Редактировать
#8416805

LINQ, объединенный с выражениями лямбды и анонимными классами в.Net 3.5 hugely, упрощает этот вид вещи.

Сомнение базы данных:

var customers = from c in db.customers
                join p in db.purchases on c.CustomerID equals p.CustomerID
                where p.purchases > 5
                select c;

Количество отчетов за страницу:

customers = customers.Skip(pageNum * pageSize).Take(pageSize);

Сортировка любой колонкой:

customers = customers.OrderBy(c => c.LastName);

Получение только отобранных областей от сервера:

var customers = from c in db.customers
                join p in db.purchases on c.CustomerID equals p.CustomerID
                where p.purchases > 5
                select new
                {
                    CustomerID = c.CustomerID,
                    FirstName = c.FirstName,
                    LastName = c.LastName
                };

Это создает статически напечатанный анонимный класс, в котором Вы можете получить доступ к его свойствам:

var firstCustomer = customer.First();
int id = firstCustomer.CustomerID;

Результаты вопросов лениво загружены по умолчанию, таким образом, Вы - not' t говорящий с базой данных, пока Вам на самом деле не нужны данные. LINQ в.Net также значительно упрощает обновления, держа datacontext любых изменений, которые Вы внесли, и только обновление областей, которые Вы изменяете.

3
0
Mark Harrison
Mark Harrison
13-го августа 2008 в 7:00
2008-08-13T19:00:32+00:00
Дополнительно
Источник
Редактировать
#8416802

Решение Oracle:

select * from (
    select a.*, rownum rnum from (
        YOUR_QUERY_GOES_HERE -- including the order by
    ) a
    where rownum <= MAX_ROW
 ) where rnum >= MIN_ROW
1
0
Grzegorz Gierlik
Grzegorz Gierlik
15-го августа 2008 в 9:44
2008-08-15T21:44:25+00:00
Дополнительно
Источник
Редактировать
#8416804

Есть несколько решений, которые я использую с MS SQL 2005.

Один из них - ROW_NUMBER (). Но, лично, я don' t как ROW_NUMBER (), потому что это doesn' t работа для больших результатов (DB, которая я продолжаю работать, действительно большая - данные на более чем 1 TB бегущие тысячи вопросов во втором - Вы знаете - большой сайт социальной сети).

Вот мое любимое решение.

Я буду использовать вид псевдо кодекса T-SQL.

Let' s находят 2-ю страницу пользователей сортированной именем, фамилией, где у каждой страницы есть 10 отчетов.

@page = 2 -- input parameter
@size = 10 -- can be optional input parameter

if @page < 1 then begin
    @page = 1 -- check page number
end
@start = (@page-1) * @size + 1 -- @page starts at record no @start

-- find the beginning of page @page
SELECT TOP (@start)
    @forename = forename,
    @surname = surname
    @id = id
FROM
    users
ORDER BY
    forename,
    surname,
    id -- to keep correct order in case of have two John Smith.

-- select @size records starting from @start
SELECT TOP (@size)
    id,
    forename,
    surname
FROM
    users
WHERE
    (forename = @forename and surname = @surname and id >= @id) -- the same name and surname, but bigger id
    OR (forename = @forename and surname > @surname) -- the same name, but bigger surname, id doesn't matter
    OR (forename > @forename) -- bigger forename, the rest doesn't matter
ORDER BY
    forename,
    surname,
    id
1
0
 Vaibhav
Vaibhav
13-го августа 2008 в 6:43
2008-08-13T18:43:17+00:00
Дополнительно
Источник
Редактировать
#8416801

На самом деле, LINQ имеет методы Skip и Take, которые можно комбинировать, чтобы выбрать, какие записи будут извлечены.

Проверьте их.

Для БД: Pagination In SQL Server 2005

1
0
 Loofer
Loofer
11-го сентября 2008 в 4:04
2008-09-11T16:04:25+00:00
Дополнительно
Источник
Редактировать
#8416806

Есть дискуссия об этом Здесь

Техника получает номер страницы 100,000 от 150 000 баз данных линии в 78 мс

Используя знание оптимизатора и НАБОР ROWCOUNT, первый EmployeeID на странице, которую требуют, сохранен в местной переменной для отправной точки. Затем, ROWCOUNT НАБОРА к максимальному количеству отчетов, которое требуют в @maximumRows. Это позволяет оповещению набор результата намного более эффективным способом. Используя этот метод также использует в своих интересах существующие ранее индексы на столе, поскольку это идет непосредственно в базисную таблицу а не в в местном масштабе составленную таблицу.

Я боюсь, что не в состоянии судить, лучше ли это, чем ток принял ответ.

0
0
Похожие сообщества 16
DotNetRuChat
DotNetRuChat
6 652 пользователей
Чат русскоязычного .NET сообщества http://dotnet.ru/ Правила: https://t.me/DotNetRuChat/704399 Вам могут быть интересны: @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @AvaloniaRU, @xamarin_russia, @DotNetRuJobs, @uwp_ru Флуд в @dotnettalks
Открыть telegram
DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
3 542 пользователей
Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.
Открыть telegram
Вакансии .NET
Вакансии .NET
3 530 пользователей
Правила: https://t.me/DotNetRuJobs/123 Канал с вакансиями - https://t.me/DotNetRuJobsFeed Вам могут быть интересны: @dotnetruchat, @cilchat, @fsharp_chat, @pro_net, @AvaloniaRU, @xamarin_russia Флуд в @dotnettalks
Открыть telegram
sql_ninja
sql_ninja
2 520 пользователей
Канал для тех, кто знает или интересуется SQL 🛢 Взаимная помощь и позитив =) Вакансии тут - @sql_jobs Бан за: оскорбления, спам, фри рекламу, расизм, сексизм. Наш MSSQL канал - @sqlcom По рекламе: @aveLestat
Открыть telegram
SQL JOBS
SQL JOBS
2 144 пользователей
Обязательны: компания, город, позиция, вилка, наличие удалёнки, требования, контакты. Бан за рекламу, сексизм, расизм и неадекватный обсёр объявлений
Открыть telegram
pro.net
pro.net
1 820 пользователей
Обсуждение .NET и всего, что с ним связано. Правила: не флудить не по теме, уважать ваших коллег и никакой рекламы (объявления о вакансиях можно согласовать с @AlexFails). https://t.me/pro_net/34653 Флудилка: @dotnettalks
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 6 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
ID
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией