การเพจปรากฏในตัวอย่างในหลายหัวข้อก่อนหน้านี้ และตอนนี้เราจะอธิบายโดยละเอียด
มีสามวิธีในการบรรลุเป้าหมายนี้:
1. วิธีการยอดนิยม(int topCount)
ใน sqlserver และ msaccess จริงๆ แล้วมันเป็นอันดับต้นๆ และใน Oracle มันถูกนำไปใช้ผ่าน rownum
2. จาก(int startIndex, int endIndex)
จำนวนเร็กคอร์ดจากแถบ startIndex ไปยังแถบ endIndex
3. หน้า (int pageSize, int pageIndex)
ขนาดหน้าต่อหน้า, ดัชนีหน้า
ด้านล่างนี้เป็นตัวอย่างของทั้งสามวิธีนี้ตามลำดับ
วิธีการยอดนิยม:
DbSession.Default.From<ผลิตภัณฑ์>()
.ยอดนิยม(10)
.ToList(); แบบสอบถามนี้สอบถาม 10 รายการแรกในตารางผลิตภัณฑ์ คำสั่ง sql ที่สร้างขึ้นมีดังนี้: (วิธีส่งออก sql ที่สร้างโดยองค์ประกอบการดู)
ข้อความ: เลือก 10 อันดับแรก * จาก [ผลิตภัณฑ์]
จากวิธี:
DbSession.Default.From<ผลิตภัณฑ์>()
.จาก(3, 8)
.ToList() ค้นหาข้อมูลจากรายการที่ 3 ถึงรายการที่ 8 (รวมถึงรายการที่ 3 และ 8) คำสั่ง SQL ที่สร้างขึ้นมีดังนี้:
ข้อความ: SELECT * FROM ( SELECT TOP 6 * FROM ( SELECT TOP 8 * FROM [Products] ORDER BY [Products].[ProductID] ASC) AS tempIntable ORDER BY [ProductID] DESC) AS tempOuttable ORDER BY [ProductID] ASC
วิธีการหน้า:
DbSession.Default.From<ผลิตภัณฑ์>()
.หน้า(10, 2)
.ToList(); สืบค้นข้อมูลในหน้า 2 จาก 10 รายการต่อหน้า คำสั่ง sql มีดังนี้:
ข้อความ: SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 20 * FROM [Products] ORDER BY [Products].[ProductID] ASC) AS tempIntable ORDER BY [ProductID] DESC) AS tempOuttable ORDER BY [ProductID] ASC
จะเห็นได้ว่าคำสั่ง SQL ที่สร้างโดยเมธอด from และเมธอดเพจมีรูปแบบเดียวกัน จริงๆ แล้วเมธอด page เรียกเมธอด from ในที่สุด
ถ้าพารามิเตอร์ startIndex จากเท่ากับ 1 วิธีการบนสุดจะถูกเรียกเพื่อสอบถาม
ตามค่าเริ่มต้น เราไม่ได้ตั้งค่าการเรียงลำดับ ส่วนประกอบจะเพิ่มการเรียงลำดับโดยอัตโนมัติ หากมีคีย์หลัก ให้เลือกการเรียงลำดับคีย์หลัก หรือเลือกคอลัมน์อื่นเพื่อเรียงลำดับ
แน่นอนว่า ในหลายกรณี เราจำเป็นต้องกำหนดคอลัมน์ที่จะเรียงลำดับ
ตัวอย่างเช่น:
DbSession.Default.From<ผลิตภัณฑ์>()
.หน้า(10, 2)
.OrderBy(Products._.UnitPrice.Desc)
.ที่ไหน(Products._.CategoryID == 2)
.ToList(); เงื่อนไขการสืบค้นคือ categoryid เท่ากับ 2 เรียงลำดับตามราคาต่อหน่วยย้อนหลัง และมีข้อมูล 10 รายการในหน้า 2 ต่อหน้า
sql ที่สร้างขึ้นมีดังนี้:
ข้อความ: SELECT * FROM ( SELECT TOP 2 * FROM [Products] WHERE [Products].[CategoryID] = @bee7551993404c8592f07f9b01710bb5 ORDER BY [Products].[UnitPrice] ASC) AS temp_table ORDER BY [UnitPrice] DESC พารามิเตอร์: @bee7551993404c859 2f07f9b 01710bb5[ Int32 ] = 2 คำสั่ง sql นี้ไม่คาดคิดหรือเปล่า ปรากฎว่าหน้าที่ 2 ของการสืบค้นที่ตรงตามเงื่อนไขมีข้อมูลเพียง 2 ส่วนเท่านั้น ดังนั้นในการสืบค้น ให้ใช้ราคาต่อหน่วยในลำดับที่เป็นบวก 2 อันดับแรก เท่านี้ก็เสร็จสิ้น
ลองลบเงื่อนไขออกแล้วดู:
DbSession.Default.From<ผลิตภัณฑ์>()
.หน้า(10, 2)
.OrderBy(Products._.UnitPrice.Desc)
//.ที่ไหน(Products._.CategoryID == 2)
.ToList(); sql ที่สร้างขึ้นมีดังนี้:
ข้อความ: SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 20 * FROM [Products] ORDER BY [Products].[UnitPrice] DESC) AS tempIntable ORDER BY [UnitPrice] ASC) AS tempOuttable ORDER BY [UnitPrice] DESC นี่คือ ขณะนี้มีรูปแบบที่สร้างขึ้นตามปกติแล้ว
สคริปต์ sql ข้างต้นทั้งหมดสร้างขึ้นภายใต้ sql server2000
ในความเป็นจริง ในระหว่างกระบวนการสืบค้น สถานประกอบการจะสืบค้นจำนวนระเบียน count() ที่ตรงตามเงื่อนไขโดยอัตโนมัติ ดังนั้นในกรณีของข้อมูลขนาดใหญ่ ประสิทธิภาพจะไม่ดีมาก
หากฐานข้อมูลที่คุณตั้งค่าคือ sql server2005 จำนวนจะไม่ถูกสอบถาม แต่จะถูกสอบถามโดยตรงผ่าน row_number() เพื่อให้ได้ประสิทธิภาพที่ดีขึ้น (Oracle ถูกนำมาใช้โดย rownum)
นี่คือตัวอย่างของ sql server2005:
DbSession.Default.From<ผลิตภัณฑ์>()
.หน้า(10, 2)
.OrderBy(Products._.UnitPrice.Desc)
//.ที่ไหน(Products._.CategoryID == 2)
.ToList(); รหัสยังคงเหมือนกับตัวอย่างข้างต้น และ sql ที่สร้างขึ้นคือ:
ข้อความ: SELECT * FROM ( SELECT *,row_number() over( ORDER BY [Products].[UnitPrice] DESC) AS tmp__rowid FROM [Products] ) AS tmp_table WHERE (tmp__rowid BETWEEN 11 AND 20) การเรียกเมธอดยังคงเหมือนเดิม ดังนั้น หากพารามิเตอร์ startIndex จาก เท่ากับ 1 ระบบจะยังคงใช้ top ก่อน และจะไม่ใช้ row_numer()
แน่นอน ถ้าคุณคิดว่าเพจไม่เหมาะพอ คุณสามารถเขียน SQL หรือกระบวนงานที่เก็บไว้ได้ด้วยตัวเอง