摘要:Effective Using LINQ To SQL (1) - 分頁技巧
Effective Using LINQ To SQL (1) - 分頁技巧
文/黃忠成
 LINQ To SQL支援了Skip與Take兩個LINQ函式,這意味著我們只要結合兩者,就能做出以往不容易做出的分頁擷取資料功能。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication19 {     class Program     {         static void Main(string[] args)         {             NorthwindDataContext context = new NorthwindDataContext();             context.Log = Console.Out;             int page = 2;             var result = (from s1 in context.Customers                            orderby s1.CustomerID select s1).Skip(page * 10).Take(10);             foreach (var item in result)                 Console.WriteLine(item.CustomerID);             Console.ReadLine();         }     } }  | 
以上這段程式的意思是,將Customers資料表以CustomerID正向排序,然後以每頁10筆的單位,取得第20-30(也就是第三頁)的資料,下面是其執行結果及SQL Output。
SELECT [t1].[CustomerID], [t1].[CompanyName], [t1].[ContactName], [t1].[ContactT itle], [t1].[Address], [t1].[City], [t1].[Region], [t1].[PostalCode], [t1].[Coun try], [t1].[Phone], [t1].[Fax], [t1].[NOTES], [t1].[TEST_ID] FROM (     SELECT ROW_NUMBER() OVER (ORDER BY [t0].[CustomerID]) AS [ROW_NUMBER], [t0]. [CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactTitle], [t0]. [Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Country], [t0].[ Phone], [t0].[Fax], [t0].[NOTES], [t0].[TEST_ID]     FROM [dbo].[Customers] AS [t0]     ) AS [t1] WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1 ORDER BY [t1].[ROW_NUMBER] -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [20] -- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [10] -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8 EASTC ERNSH FAMIA FISSA FOLIG FOLKO FRANK FRANR FRANS FURIB  | 
LINQ To SQL善用了SQL Server 2005的ROW_NUMBER指令來完成Skip與Take的功能。
不過,說實在的,分頁其實最常用在於UI顯示的部份,尤其是ASP.NET應用程式上,而ASP.NET 3.5所提供的LINQDataSource控件已自動會處理分頁動作,所以,設計師自行處理分頁的機會變少了許多。
 而Windows Form、WPF,因為沒有LINQDataSource可用,所以要處理分頁,得自己來才行,不過,這複雜度可不是僅呼叫Skip、Take就能處理了,必須自己實做類似BindingSource的控件才行。