ทำ Paging ง่ายๆ กับ Linq to SQL

คราวก่อนผมได้พูดถึงฟังค์ชั่น ROW_NUMBER ของ SQL Server 2005 ซึ่งเป็นตัวสำคัญในการทำ paging
ในทางปฏิบัติแล้ว ถ้าเราใช้ Linq to SQL เราไม่จำเป็นต้องเขียน SQL ซับซ้อนขนาดนั้นก็ได้
ในมุมของ Linq to SQL การทำ paging ก็คือการ Skip และ Take นี่เอง
(Skip ใช้สำหรับกระโดดข้ามข้อมูลใน set ไปจำนวน n ตัว, Take ใช้สำหรับเลือกข้อมูลจาก set มาจำนวน n ตัว)
โชคดีที่ทีมพัฒนา Linq to SQL ได้ทำการแปลความหมายของคำสั่ง Skip และ Take ออกมาเป็น SQL Query ให้ด้วย
นั่นทำให้การเขียน Query เพื่อทำ paging นั้นง่ายราวกับปอกกล้วย

ตัวอย่าง Linq Query แบบนี้

Dim ctx As New MyDataContext
Dim result = (From p In ctx.Products _
              Order By p.product_code _
              Skip 100 Take 10).ToArray

ถ้าใช้ SQL Profiler จับดูจะพบว่ามันถูกแปลงกลายเป็น SQL Query ประมาณนี้ (ผมดัดแปลงเล็กน้อย ตัดเอาเฉพาะส่วน query ออกมา)

SELECT [t1].[product_id], [t1].[product_code], [t1].[product_name]
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY [t0].[product_code]) AS [ROW_NUMBER], [t0].[product_id], [t0].[product_code], [t0].[product_name]
    FROM [dbo].[Product] AS [t0]
    ) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]

โดยที่ @p0=100 และ @p1=10

เป็นอันว่าสบายครับ ทำ paging ได้โดยแทบไม่ต้องรู้จักฟังค์ชั่น ROW_NUMBER ก็ยังได้

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: