다음을 통해 공유


방법: 시퀀스의 요소 반환 또는 건너뛰기(LINQ to SQL)

업데이트: November 2007

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

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

참고:

Take<TSource>Skip<TSource>에는 SQL Server 2000에 대한 쿼리에서 사용할 경우 몇 가지 제한이 따릅니다. 자세한 내용은 문제 해결(LINQ to SQL)의 "SQL Server 2000의 Skip 및 Take 예외" 항목을 참조하십시오.

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

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

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

예제

다음 예제에서는 Take를 사용하여 고용된 처음 다섯 명의 Employees를 선택합니다. 컬렉션은 우선 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
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);
}

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

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
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);
}

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

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
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);
}

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

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

참고:

SQL Server 2000과 SQL Server 2005의 변환은 서로 다릅니다. 복잡한 쿼리와 함께 Skip<TSource>을 사용하려면 SQL Server 2005를 사용하십시오.

SQL Server 2000에 대해 다음 LINQ to SQL 쿼리를 확인해 보십시오.

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
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);
}

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]

Take<TSource>Skip<TSource>을 함께 연결하면 모든 지정된 정렬이 일치해야 합니다. 그렇지 않은 경우에는 결과가 정의되지 않습니다.

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

참고 항목

참조

표준 쿼리 연산자 변환(LINQ to SQL)

기타 리소스

쿼리 예제(LINQ to SQL)