LINQ의 .Skip(1000)을 쓰는 방법순수 SQL로 취득(100)하시겠습니까?
에 해당하는 SQL은 무엇입니까?.Skip()
LINQ의 메서드?
예를 들어 다음과 같습니다.특정 데이터베이스 테이블에서 1000~1100 행을 선택하고 싶습니다.
SQL만으로 가능합니까?아니면 테이블 전체를 선택하고 메모리에서 행을 찾아야 합니까?테이블이 꽤 클 수 있기 때문에 가능하면 피하고 싶습니다.
SQL Server 2012 이상에서는 다음 구문이 추가되었습니다.
SELECT *
FROM Sales.SalesOrderHeader
ORDER BY OrderDate
OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY
SQL Server 2005 이상에서는 ROW_NUMBER 함수를 사용할 수 있습니다.예:
USE AdventureWorks;
GO
WITH OrderedOrders AS
(
SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
FROM Sales.SalesOrderHeader
)
SELECT *
FROM OrderedOrders
WHERE RowNumber BETWEEN 51 AND 60; --BETWEEN is inclusive
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;
이것은 동작합니다만, ORDER BY 로부터row_number 를 제조할 필요가 있는 경우, 서버측에서 쿼리가 정렬되어 퍼포먼스 문제가 발생할 수 있습니다.인덱스가 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)을 실행합니다.LINQ의 (100)을 SQL datacontext로 가져와서 SQL 출력을 확인합니다.설명에 따라 SQL 문이 생성됩니다.
그렇게 우아하지는 않겠지만 일을 해낼 수 있다.
아니요, 하지만 MySQL의 LIMIT 절(Stack Overflow 링크)을 에뮬레이트하여 동일한 결과를 얻을 수 있습니다.
언급URL : https://stackoverflow.com/questions/1744802/how-do-i-write-linqs-skip1000-take100-in-pure-sql
'prosource' 카테고리의 다른 글
WPF의 커스텀커서? (0) | 2023.04.13 |
---|---|
VBA에서 문자열을 연결하려면 어떻게 해야 하나요? (0) | 2023.04.13 |
커밋을 푸시한 후 git에서 어떻게 스쿼시합니까? (0) | 2023.04.13 |
Esqueleto를 사용한 목록 유형 처리 (0) | 2023.04.13 |
iOS에서 Base64 인코딩을 하려면 어떻게 해야 하나요? (0) | 2023.04.13 |