Что представляет собой SQL-эквивалент .Skip()
метода в LINQ?
Например: я хотел бы выбрать строки 1000-1100 из определенной таблицы базы данных.
Возможно ли это с помощью только SQL? Или мне нужно выделить всю таблицу, а затем найти строки в памяти? В идеале я бы хотел по возможности избежать этого, так как стол может быть довольно большим.
.net
sql
sql-server
Луч
источник
источник
В SQL Server 2012 и выше добавлен следующий синтаксис:
SELECT * FROM Sales.SalesOrderHeader ORDER BY OrderDate OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY
источник
LINQ to SQL делает это с помощью оконной функции ROW_NUMBER:
SELECT a,b,c FROM (SELECT a,b,c, ROW_NUMBER() OVER (ORDER BY ...) as row_number FROM Table) t0 WHERE to.row_number BETWEEN 1000 and 1100;
Это работает, но необходимость создания row_number из ORDER BY может привести к тому, что ваш запрос будет отсортирован на стороне сервера и вызовет проблемы с производительностью. Даже если индекс может удовлетворить требование ORDER BY, запрос все равно должен подсчитать 1000 строк, прежде чем он начнет возвращать результаты. Слишком часто разработчики забывают об этом и просто вводят элемент управления разбиением на страницы для таблицы в 5 миллионов строк и задаются вопросом, почему первая страница возвращается намного быстрее, чем последняя ...
Тем не менее использование ROW_NUMBER (), вероятно, является лучшим балансом между простотой использования и хорошей производительностью, при условии, что вы избегаете сортировки (условие ORDER BY может быть выполнено с помощью индекса).
источник
Попробуй это:
select * from [Table-Name] order by [Column-Name] offset [Skip-Count] rows FETCH NEXT [Take-Count] rows only
Пример:
select * from Personals order by Id offset 10 rows --------->Skip 10 FETCH NEXT 15 rows only --------->Take 15
источник
Сделай это:
Запустите .Skip (1000) .Take (100) в тексте данных LINQ to SQL и просмотрите выходные данные SQL. Он сгенерирует для вас оператор SQL, который выполняет то, что вы описываете.
Он не будет таким элегантным, но выполнит свою работу.
источник
Нет, но вы можете эмулировать предложение MySQL LIMIT (ссылка на переполнение стека) для достижения того же результата.
источник