使用 Take 操作符來傳回序列中指定數個元素,然後略過其餘部分。
使用Skip運算子來略過序列中指定數目的元素,然後傳回其餘的元素。
備註
Take 和 Skip 在針對 SQL Server 2000 的查詢中使用它們時,會有某些限制。 如需詳細資訊,請參閱 疑難解答中的「SQL Server 2000 中的略過和擷取例外狀況」條目。
LINQ to SQL 使用包含 SQL Skip 子句的子查詢將 NOT EXISTS 進行轉譯。 此翻譯有下列限制:
自變數必須是集合。 多重集合不支援,即使已排序也是如此。
產生的查詢可能比針對套用的基底查詢所產生的查詢 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
下列範例結合了 Skip 和 Take 方法,以略過前 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
Take 和 Skip 作業只會針對已排序的集合進行妥善定義。 未排序集合或多重集的語意未定義。
由於 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]
當 Take 和 Skip 鏈結在一起時,所有指定的排序都必須一致。 否則,結果為未定義。
對於基於 SQL 規格的非負數常整數引數,Take 和 Skip 都被妥善定義。