다음을 통해 공유


시퀀스에서 요소 반환 또는 건너뛰기

Take 연산자를 사용하여 지정된 수의 시퀀스 요소를 반환한 다음 나머지는 건너뜁니다.

Skip 연산자를 사용하여 지정된 수의 시퀀스 요소를 건너뛴 다음 나머지를 반환합니다.

참고 항목

TakeSkip에는 SQL Server 2000에 대한 쿼리에서 사용할 경우 몇 가지 제한이 따릅니다. 자세한 내용은 문제 해결의 “SQL Server 2000의 Skip 및 Take 예외” 항목을 참조하세요.

LINQ to SQL은 SQL NOT EXISTS 절과 함께 하위 쿼리를 사용하여 Skip을 변환합니다. 이 변환에는 다음과 같은 제한 사항이 있습니다.

  • 인수는 집합이어야 합니다. 다중 집합은 정렬된 경우에도 지원되지 않습니다.

  • 생성된 쿼리는 Skip이 적용된 기본 쿼리에 대해 생성된 쿼리보다 더 복잡할 수 있습니다. 이러한 복잡성은 성능을 감소시키거나 시간이 초과될 수도 있습니다.

예 1

다음 예제에서는 Take를 사용하여 고용된 처음 다섯 명의 Employees를 선택합니다. 컬렉션은 우선 HireDate로 정렬됩니다.

IQueryable<Employee> firstHiredQuery =
    (from emp in db.Employees
    orderby emp.HireDate
    select emp)
    .Take(5);

foreach (Employee empObj in firstHiredQuery)
{
    Console.WriteLine("{0}, {1}", empObj.EmployeeID,
        empObj.HireDate);
}
Dim firstHiredQuery = _
    From emp In db.Employees _
    Select emp _
    Order By emp.HireDate _
    Take 5

For Each empObj As Employee In firstHiredQuery
    Console.WriteLine("{0}, {1}", empObj.EmployeeID, _
        empObj.HireDate)
Next

예제 2

다음 예제에서는 Skip을 사용하여 10개의 가장 비싼 Products를 제외한 모두를 선택합니다.

IQueryable<Product> lessExpensiveQuery =
    (from prod in db.Products
    orderby prod.UnitPrice descending
    select prod)
    .Skip(10);

foreach (Product prodObj in lessExpensiveQuery)
{
    Console.WriteLine(prodObj.ProductName);
}
Dim lessExpensiveQuery = _
    From prod In db.Products _
    Select prod _
    Order By prod.UnitPrice Descending _
    Skip 10

For Each prodObj As Product In lessExpensiveQuery
    Console.WriteLine(prodObj.ProductName)
Next

예 3

다음 예제에서는 SkipTake 메서드를 결합하여 처음 50개의 레코드를 건너뛴 다음 그 이후 10개의 레코드를 반환합니다.

var custQuery2 =
    (from cust in db.Customers
    orderby cust.ContactName
    select cust)
    .Skip(50).Take(10);

foreach (var custRecord in custQuery2)
{
    Console.WriteLine(custRecord.ContactName);
}
Dim custQuery2 = _
    From cust In db.Customers _
    Order By (cust.ContactName) _
    Select cust _
    Skip 50 _
    Take 10

For Each custRecord As Customer In custQuery2
    Console.WriteLine(custRecord.ContactName)
Next

TakeSkip 작업은 정렬된 집합에 대해서만 제대로 정의됩니다. 정렬되지 않는 집합 또는 다중 집합에 대한 의미는 정의되어 있지 않습니다.

SQL의 순서 지정에 대한 제한 사항 때문에 LINQ to SQL은 Take 또는 Skip 연산자의 순서 지정 인수가 연산자의 결과로 이동합니다.

참고 항목

SQL Server 2000과 SQL Server 2005의 번역은 다릅니다. 복잡한 쿼리와 함께 Skip을 사용하려면 SQL Server 2005를 사용하세요.

SQL Server 2000에 대한 다음 LINQ to SQL 쿼리를 고려하세요.

IQueryable<Customer> custQuery3 =
    (from custs in db.Customers
     where custs.City == "London"
     orderby custs.CustomerID
     select custs)
    .Skip(1).Take(1);

foreach (var custObj in custQuery3)
{
    Console.WriteLine(custObj.CustomerID);
}
Dim custQuery3 = _
    From custs In db.Customers _
    Where custs.City = "London" _
    Select custs _
    Order By custs.CustomerID _
    Skip 1 _
    Take 1

For Each custObj In custQuery3
    Console.WriteLine(custObj.CustomerID)
Next

LINQ to SQL에서는 다음과 같이 정렬을 SQL 코드의 끝 부분으로 이동합니다.

SELECT TOP 1 [t0].[CustomerID], [t0].[CompanyName],
FROM [Customers] AS [t0]
WHERE (NOT (EXISTS(
    SELECT NULL AS [EMPTY]
    FROM (
        SELECT TOP 1 [t1].[CustomerID]
        FROM [Customers] AS [t1]
        WHERE [t1].[City] = @p0
        ORDER BY [t1].[CustomerID]
        ) AS [t2]
    WHERE [t0].[CustomerID] = [t2].[CustomerID]
    ))) AND ([t0].[City] = @p1)
ORDER BY [t0].[CustomerID]

TakeSkip을 함께 연결하면 모든 지정된 정렬이 일치해야 합니다. 그렇지 않으면 결과가 정의되지 않습니다.

SQL 사양을 기반으로 하는 정수 계열 상수 인수로 음수가 아닌 경우 TakeSkip은 제대로 정의됩니다.

참고 항목