แปล SQL เป็น Linq - Part III

Posted 27/10/2009 20:08 by chaowman

Part สุดท้ายแล้วนะครับ
ต่อจาก Post ที่แล้ว
คราวนี้เรามาดูวิธีใช้ Linq สำหรับ Order By, Group By และ Set Operation กัน

 

ORDER BY – Simple

ใน SQL เราสามารถจัดเรียงตาม Field ที่เราต้องการได้ โดยคำสั่ง ORDER BY

image 

ใน Linq ก็แทบเหมือนกันทุกประการเลยครับ

image 

จากตัวอย่างคือ เรียก Customer ทั้งหมด โดยเรียงตาม CustomerID

 

ORDER BY – Multiple

คราวนี้เรามาดูกันต่อว่า การจัดเรียงจากมากไปน้อย
และการจัดเรียงหลาย ๆ Field เขียนอย่างไร

image

การเรียงจากมากไปน้อย ก็แค่ใส่คำสั่งตามหลังว่า DESC
และการเรียงมากกว่า  1 Field ก็คั่นด้วย , (Comma)
และขึ้น Field ถัดไป

ใน Linq ก็คล้าย ๆ กัน

image 

การเรียงจากมากไปน้อยใน Linq ใช้คำสั่ง descending
และ Field ถัดไปก็ใช้ , (Comma) เช่นเดียวกัน

และผลลัพธ์จาก Query ด้านบนคือ เรียก Customer ทุกรายการ
โดยเรียงตาม City เรียงจากมากไปน้อย และถ้าอยู่ใน City เดียวกัน
ก็เรียงตาม ContactName

 

GROUP BY – Single

คำสั่ง GROUP BY คือ การจัดกลุ่ม
โดย Field ที่ต้องการจัดกลุ่มต้องอยู่ในคำสั่ง GROUP BY
และ Field อื่น ๆ ที่ไม่ได้จัดกลุ่ม ต้องมีการทำ Aggregation เช่น SUM, COUNT

ใน SQL GROUP BY เขียนอย่างนี้ครับ

image

ผลลัพธ์คือ ดูว่า แต่ละเมืองมีลูกค้าอยู่กี่คน

ใน VB และ C# ต่างกันนิดหน่อยเรื่องการทำ Aggregation
Code VB ดังนี้

image

Aggregation จะอยู่หลัง Into คล้าย ๆ กับ GROUP JOIN ในบทที่แล้ว
ส่วน C# เขียนอย่างนี้ครับ

image

C# จะค่อนข้างซับซ้อนหน่อย
ระหว่างคำว่า group และ by
เราต้องกำหนดว่า สิ่งที่เราเลือกมาอยู่ใน group คืออะไร

ในที่นี้ผมใส่ c หมายถึง Customer แต่ละคน
และหลัง into ก็ต้องกำหนด variable สำหรับ Group ของแต่ละ City ในที่นี้คือ g

และในส่วนของ select เราจะไม่สามารถใช้ c ได้อีกต่อไป
เพราะ c โดน group ไปแล้ว เราต้องใช้ g แทน
โดย g.Key หมายถึง key ของ Group นั้น ๆ ในที่นี้ หมายถึง City ต่าง ๆ
และเราสามารถใส่ Aggregate function ผ่าน g ได้ เช่น g.Count(), g.Sum()

 

GROUP BY – Multiple

เราสามารถ GROUP ได้มากกว่า 1 Field
SQL เขียนอย่างนี้ครับ

image

ก็แค่ใช้ , (Comma) คั่นชื่อ Field ถัดไป
ใน VB ก็คล้าย ๆ กัน

image

ใช้ , (Comma) คั่นเช่นเดียวกัน
แต่ใน C# จะเพิ่มอีกนิดหน่อย

image

ใน group by เราต้องประกาศ Anonymous Type เช่นเดียวกับ คำสั่ง select

และผลลัพธ์ของ Query ข้างบนคือ จัดกลุ่มลูกค้าตามภาคและเมือง
โดยเลือกผลลัพธ์คือ ภาค, เมือง, และลูกค้าคนแรก

 

GROUP BY – Having

อีกนิดนึงสำหรับ GROUP BY คือ เราสามารถ Filter สิ่งที่เรา GROUP ไปแล้ว
ผ่านคำสั่ง HAVING ครับ

image

HAVING คล้าย ๆ กับ WHERE
แต่เป็นการกรองคำสั่งที่เป็น Aggregration เช่น SUM, COUNT

Query ด้านบนคือ เรียกเมืองต่าง ๆ ที่มีลูกค้ามากกว่า 3 คน

ใน VB เขียนอย่างนี้ครับ

image

ง่าย ๆ  ก็แค่ใช้คำสั่ง Where ไปเลย
ไม่ต้องมีคำสั่ง Having ให้ยุ่งยาก

C# ก็เช่นเดียวกันครับ

image

ใช้ where แทน having ไปเลย

 

UNION ALL

ใน SQL เราสามารถรวมผลลัพธ์ของ 2 Query ได้ ด้วยคำสั่ง UNION ALL

image 

คุณสามารถเอาคำสั่ง UNION ALL มาคั่นระหว่าง 2 Query
เพื่อรวม Result ทั้ง 2 Query
จากตัวอย่างคือ เลือก CustomerID ที่มีรหัสไปรษณีย์ขึ้นต้นด้วย 123 และ 456

ใน Linq เขียนอย่างนี้ครับ

image

เราสามารถใช้คำสั่ง Concat แทนคำว่า UNION ALL
โดยตัว Query เราสามารถแยกไปใส่ตัวแปรได้เลย

 

UNION/INTERSECT/EXCEPT

ใน SQL เราสามารถรวมผลลัพธ์ของ Query ในรูปแบบของ Set Operation
โดย UNION คือ การรวมผลลัพธ์ทั้งสอง Query ไว้ด้วยกัน
ซึ่งต่างจาก UNION ALL ตรงที่ผลลัพธ์ที่มีค่าเท่ากันจะแสดงเพียงครั้งเดียว
INTERSECT คือ การแสดงเฉพาะผลลัพธ์ที่มีค่าเท่ากัน
EXCEPT คือ การแสดงผลลัพธ์ของ Query แรก ที่ไม่มีค่าที่เท่ากันใน Query ที่สอง

ใน SQL เราเขียนอย่างนี้

image

ในส่วนของ UNION, INTERSECT, EXCEPT ให้ใส่เพียงคำสั่งเดียว ไม่ต้องมีเครื่องหมายวงเล็บ <> และเครื่องหมาย /

ใน Linq ก็ใช้คำสั่งชื่อเดียวกัน

image

ผลลัพธ์ของ Union คือ ลูกค้าที่อยู่ในกรุงเทพฯ หรือ มีรหัสไปรษณีย์ขึ้นต้นด้วย 123
ผลลัพธ์ของ Intersect คือ ลูกค้าที่อยู่ในกรุงเทพฯ และมีรหัสไปรษณีย์ขึ้นต้นด้วย 123
ผลลัพธ์ของ Except คือ ลูกค้าที่อยู่ในกรุงเทพฯ ที่ไม่มีรหัสไปรษณีย์ที่ขึ้นต้นด้วย 123

จบแล้วครับ หวังว่าคุณที่เพิ่งหัด SQL จะเข้าใจ SQL เพิ่มขึ้นบ้าง
และผู้ที่เขียนหัดเขียน Linq อยู่จะเข้าใจ Linq มากขึ้นครับ image

About chaowman

หาอะไรอยู่หรือจ๊ะ?

ร่วมให้กำลังใจนักเขียน

อ่านแล้วชอบใจ อยากให้กำลังใจกับผู้แต่งบทความนี้ ขอเชิญร่วมให้กำลังใจผ่าน Paysbuy/Paypal นะครับ ปลอดภัยเพราะทำงานผ่าน SSL และไม่มีค่าใช้จ่ายเพิ่มเติมครับ เว็บเราให้นักเขียน 100% ครับ

Comment ระบบเก่า

 

frontpage said:

&#160; คุณยังรู้สึกว่า ตอนนี้เขียนโปรแกรมทำอะไรที่ต้องแสดงข้อมูลที เป็นเรื่องยุ่งยากน่าเบื่อหรือเปล่า

March 21, 2010 3:49 AM
 

thekingdom said:

It's Work!!! thx

April 1, 2010 1:16 AM
(required)  
(optional)
(required)  
Add

DisQUS Comment (ยังเอ๋อๆ อยู่)

blog comments powered by Disqus