วันจันทร์ที่ 8 พฤศจิกายน พ.ศ. 2553

LINQ คืออะไร

LINQ นั้น ย่อมาจาก Language Integrated Query หรือแปลเป็นไทย ก็ "การทำ Query แบบฝังในภาษา" ซึ่งในความเป็นจริงนั้นก็ไม่ได้ต่างจากคำแปลซักเท่าไหร่นักครับ เพราะถ้าโค๊ดที่มีการใช้ LINQ คุณจะพบกับคำสั่ง ที่มีลักษณะคล้ายภาษา SQL แบบนี้ ในโค๊ดเลย



คุณ อาจจะมองว่า เฮ้ นี่ต่อไปเราจะไม่ต้องมานั่งต่อฐานข้อมูล หรือจำว่าต้องสร้าง Connection แล้วสั่ง New Command จากนั้น ExecuteReader กันแล้วใช่มั๊ย? นั่นก็ถูกต้องครับ แต่ไม่ซะทีเดียว เพราะอันที่จริงแล้ว ถ้าเรามองจาก Syntax และเทคนิคที่ใช้ LINQ นั้น ถูกออกแบบมาให้ทำงานกับข้อมูลในแรมครับ แต่การที่เราสามารถใช้ LINQ ไปทำการติดต่อกับฐานข้อมูลได้เหมือนกัน แต่ว่า เดี๋ยวเราจะกลับมาในเรื่องนั้นอีกครั้ง ภายหลัง

ถ้าไม่ต้อฐานข้อมูล แล้วจะอ่านไปเพื่ออะไร?

เนื่อง จากการจะเข้าใจ LINQ แบบถึงแก่น และจะได้นำเอามันไปใช้ให้เหมาะสม รวมถึงเอาฟีเจอร์ใหม่ๆ ที่เป็นผลพลอยได้จากการมี LINQ ไปใช้ได้ด้วย บทความในชุดนี้ผมจะพยายามครอบคลุมเรื่องพื้นฐานทั้งหมดด้วย สำหรับผู้ที่เริ่มจะเข้ามาใช้ C# และเริ่มคุ้นเคยกับภาษาแล้ว แต่ยังไม่ได้ลองเล่นกระบวรท่าพิสดารของภาษานี้ จะได้ฝึกวิทยายุทธตามไปด้วยครับ ส่วนผู้ที่เป็นอยู่แล้ว ก็น่าจะได้มาช่วยกันขัดเกลาให้มันดียิ่งขึ้น ในเรื่องที่เป็นอยู่แล้ว และมาศึกษาฟีเจอร์ใหม่ๆ ที่เพิ่มเข้ามา จะได้นำเอามันไปใช้ได้ และทำให้เขียนโค๊ดได้เร็ว และกระชับมากขึ้นครับ

แล้วถ้าจะใช้ LINQ กับข้อมูลในแรม มันจะมีประโยชน์อะไร???

มีแน่นอนครับ ผมเชื่อว่าถ้าคุณเขียนโปรแกรมที่ต้องมีการแสดงผลข้อมูลจำนวนมากคุณจะต้องได้ทำสิ่งเหล่านี้แน่นอน
  • Sort (เรียง) ข้อมูล ตามที่ผู้ใช้กำหนด
  • Filter ข้อมูล ตามที่ผู้ใช้กำหนด
  • หาค่าต่างๆ เช่น Min, Max, Mean, Sum
  • จัดกลุ่มข้อมูล

แต่ คุณก็จะคิดในใจว่า อ้าว พวกนี้ เราก็ใช้ตัวฐานข้อมูล ทำให้เราได้แล้วนี่นา? ถ้าเราอยากจะเรียง เราก็สั่งให้ Sql Server มัน ORDER BY ให้เรา หรือว่า จะ Filter เราก็ใช้ WHERE หาค่า MIN, MAX, SUM ก็ใช้ SELECT SUM(field) FROM table หรือจะจัดกลุ่ม ก็ GROUP BY ผมก็บอกว่า นั่นก็ถูกต้องครับ แต่ถ้าลองนึกดู จุดที่ LINQ จะมีประโยชน์ ก็คือ

* แหล่งข้อมูล อาจไม่ได้มาจากฐานข้อมูลเสมอไป
อย่าง ในปัจจุบัน ที่เราพยายามทำอะไรเป็น SOA มากขึ้น เราอาจจะทำการเรียกข้อมูล จาก Web Service มาก็ได้ ซึ่งข้อมูลที่ได้มา ก็จะเป็นในรูปของ Array ของคลาส หรือว่า เป็น List<คลาส> แบบนี้ แน่นอนว่า เราจะหวังพึ่งคำสั่ง SQL ไม่ได้แน่นอน หรือไม่อย่างนั้น เราก็อาจจะต้องทำ Web Service ที่เปิดพารามิเตอร์ รับเป็นคำสั่ง SQL ซึ่งนอกจากจะมีความเสี่ยงต่อ SQL Injection Attack แล้ว ก็ยังมีปัญหาที่...

* ช่วยปริมาณและความถี่ของการเปิด Connection ไปยังแหล่งข้อมูล หรือตัว Web Service

ถ้า หากว่า เราจะใช้การติดต่อฐานข้อมูล หรือ Web Service ทุกครั้ง ที่มีการเปลี่ยนแปลงการ Sort, Filter แน่นอนว่า ก็ต้องมีการเปิด Connection ไปยังฐานข้อมูล หรือ Web Service ทุกครั้ง ใช่ไหมครับ? นอกจากจะเป็นการทำให้โปรแกรมเราดูช้าลงแล้ว (เพราะต้องรอผลจาก Server) ยังเป็นการไปเพิ่ม Load ให้กับ Server เหล่านั้นด้วย ลองนึกถึงว่า ถ้าโปรแกรมเราทำงานที่ธนาคาร แล้วผู้บริหารระดับสูงต้องการดูรายงาน Transaction ที่มียอดสูงเกิน 1 ล้านบาท ที่เกิดขึ้นในแต่ละวัน จากผู้ลูกค้าจำนวนกว่า 10 ล้านคนทุกวัน แล้วให้เขาสามารถเล่นกับข้อมูลได้ เอาแค่โดยการ Sort ก็พอ ลองคิดดูสิครับ ว่า Transaction ที่เกิน 1 ล้านบาท อาจจะมีแค่ราว 1,000 Transaction แต่ระบบฐานข้อมูล จะต้องไปทำการ Query ข้อมูล 1,000 แถวนี้มาจากตาราง ที่อาจจะมีข้อมูลถึ 5 ล้านแถวต่อวัน แล้วส่งกลับมาให้ แน่นอนว่า โปรแกรมเราคงจะค้างไปนาน กว่าจะได้ผลลัพธ์ แน่นอนว่า ทางที่ดีที่สุด เราก็แค่เขียนฟังก์ชั่น Quick Sort หรือใช้ Array.Sort กับข้อมูล 1,000 แถว ที่อยู่ในโปรแกรมเราอยู่แล้ว น่าจะดีกว่า ถูกไหมครับ?
เอาละครับ เรารู้ถึง ประโยชน์ของมันแล้ว ลองมาทำความรู้จักกับมันแบบลึกซึ้งกันดีกว่าครับ

LINQ คือ แนวคิดแบบ Functional Programming

ถึง ตรงนี้ อย่าเพิ่งไปเปิดอ่าน Text เรื่อง Functional Programming (FP) นะครับ ผมเองก็ยอมรับว่า เคยพลาดไปพยายามทำความเข้าใจอยู่พักใหญ่ แล้วยังไปแนะนำให้คนอื่นลองหาอ่านอีก (แหะๆ) เพราะว่า แนวคิดนี้ ไม่ใช่ความคิดใหม่ครับ เป็นแนวความคิดที่เกิดขึ้นเมื่อกว่า 30 ปีที่แล้ว เป็นมีภาษาที่ชื่อว่า ML ที่เป็นแนวคิดนี้ด้วยครับ จะไปลองเล่นดูก็ได้นะครับ และเหมือนว่า ทุกคน (หมายถึง พวกนัก Com Sci ทั้งหลาย) จะรู้แล้วว่า แนวคิดนี้ ใช้แบบเพียวๆ เลย ไม่ดี จะต้องใช้ร่วมกับภาษาโปรแกรมมิ่งทั่วๆ ไป ที่เราใช้กันอยู่ ถึงจะได้ประโยชน์สูงสุด ซึ่ง LINQ เอง ก็คือการนำเอาแนวคิดนี้มาประบุกต์ใช้ครับ

อ่านเพิ่มเติม.. http://coredeveloper.net/blogs/nantcom/archive/2008/07/01/linq-1.aspx

ที่มา http://www.deelike.com/webboard/index.php?topic=271.0