ก่อนที่จะไปถึงในส่วนของวิธีการจัดการข้อมูลด้วย LINQ เรามาพูดถึงที่มาที่ไปอย่างคร่าวๆ ของ LINQ กันสักเล็กน้อยนะคะ LINQ มีชื่อเต็มว่า “Language-Intergrated Query” ถือเป็นภาษาใหม่ที่ขยายความสามารถในการเขียนโปรแกรมโดยเลียนแบบภาษา SQL จึงทำให้มีการใช้งาน keyword ที่คุ้นเคยกันดีในคำสั่ง SQL เช่น select from where เป็นต้น ซึ่งมีความนิยมกับการทำงานด้านฐานข้อมูลมากขึ้นในปัจจุบัน และได้ถูกนำมารวมกับภาษาพัฒนาโปรแกรมทำให้การพัฒนาโปรแกรมควบคุมข้อมูลให้อยู่ในแนวการเขียนโปรแกรมเดียวกัน และช่วยอำนวยความสะดวกรวมถึงเพิ่มความคล่องตัวให้กับผู้พัฒนาในการจัดการข้อมูลมากยิ่งขึ้น โดย LINQ นี้ถูกนำมาใช้ตั้งแต่ .NET Framework 3.5 ที่มากับ Visual studio 2008 ซึ่งจะมีการติดต่ออยู่ด้วยกัน 3 ประเภท คือ
- ข้อมูลประเภท Object
- ข้อมูลประเภทฐานข้อมูลเชิงสัมพันธ์ ซึ่งมีรูปแบบการใช้งานแตกต่างกันไป จึงแยกออกเป็น
- LINQ to Dataset
- LINQ to SQL
- LINQ to Entity
- ข้อมูล XML
โดยในบทความนี้ผู้เขียนจะขอแยกวิธีการจัดการข้อมูลออกเป็นเรื่องๆ ที่ถือเป็นพื้นฐานที่มือใหม่ควรรู้ และเน้นยกตัวอย่างหลายๆกรณีเพื่อให้ผู้อ่านเข้าใจการทำงาน และมีแนวทางในการนำไปใช้มากขึ้น ดังนี้
- การดึงข้อมูลแบบทั่วไปโดยใช้คำสั่ง Select
ตัวอย่างที่ 1 : กรณีดึงข้อมูลจาก Object มาแสดง
List<Customer> customers= GetCustomer (); var qCustomers = from cust in customers select cust;
คำอธิบาย : จากตัวอย่างข้างต้น จะเห็นว่า มีการใช้คำสั่ง select ในการดึงข้อมูลจาก object list ของ class ที่มีชื่อว่า Customer ทั้งหมดมาใส่ในตัวแปร qCustomers โดยมีการประกาศเป็น var ไว้ เนื่องจาก LINQ เองจะสามารถแปลงค่าของข้อมูลตัวแปรที่รับมาโดยไม่ต้องมีการระบุชนิดของข้อมูล และ compiler จะทำการแปลงรูปแบบและชนิดของตัวแปรได้อัตโนมัติ โดยสามารถนำผลลัพธ์ที่ได้มาวนแสดง ดังนี้
Console.WriteLine("Customer name list:"); foreach (var custlist in qCustomers ) { Console.WriteLine(custlist.name); }
ตัวอย่างที่ 2 : กรณีจากตัวแปรอาร์เรย์
int[] numbers = { 2,7,5,3,1,6 }; var result = from n in numbers select n -1; Console.WriteLine("Result:"); foreach (var i in result) { Console.WriteLine(i); }
คำอธิบาย : จากตัวอย่างข้างต้น จะเห็นว่า มีการใช้คำสั่ง select ในการดึงข้อมูลจากตัวแปรอาร์เรย์ที่มีชื่อว่า numbers ทั้งหมดมาใส่ในตัวแปร result โดยเพิ่มเติมให้มีการนำค่าที่ดึงมาได้ -1 และนำมาวนแสดง
ผลลัพธ์ที่ได้ : 1 6 4 2 0 5
ตัวอย่างที่ 3 : การแปลงค่าข้อมูลจากตัวแปรอาร์เรย์ที่มีชนิดเป็น string ให้เป็นตัวอักษรพิมพ์เล็กและพิมพ์ใหญ่ ดังนี้
string[] words = { "aPPLE", "BlUeBeRrY", "cHeRry" }; var upperLowerWords = from w in words select new { Upper = w.ToUpper(), Lower = w.ToLower() }; foreach (var ul in upperLowerWords) { Console.WriteLine("Uppercase: {0}, Lowercase: {1}", ul.Upper, ul.Lower); }
คำอธิบาย : เป็นการนำข้อมูลจากตัวแปรอารย์เรย์ที่เป็นชนิด string มาแปลงเป็นตัวอักษรพิมพ์ใหญ่และกำหนดให้อยู่ในฟิลด์ใหม่ที่มีชื่อว่า Upper และแปลงอักษรที่อ่านได้เป็นตัวพิมพ์เล็กให้อยู่ในฟิลด์ใหม่ที่มีชื่อว่า Lower โดยเมื่อมีการเรียกใช้เพื่อดึงค่ามาแสดง เราสามารถเรียกใช้ผ่านทางชื่อที่เรากำหนดขึ้นใหม่ได้ เช่น ul.Upper นั่นเอง
ผลลัพธ์ที่ได้ :
Uppercase: APPLE, Lowercase: apple
Uppercase: BLUEBERRY, Lowercase: blueberry
Uppercase: CHERRY, Lowercase: cherry
- การค้นหาข้อมูลโดยใช้ Where เพื่อเป็นการเพิ่มเงื่อนไขในการดึงข้อมูล ซึ่งมีทั้งวิธีที่ใช้ operator ที่มีชื่อว่า Where และแบบที่ใช้ เมธอด Where ซึ่งจะอธิบายและยกตัวอย่างดังนี้
ตัวอย่างที่ 1 : เป็นการดึงข้อมูลสินค้าที่หมดในสต็อก โดยใช้ operator ที่มีชื่อว่า Where
List<Product> products = GetProductList(); var soldOutProducts = from p in products where p.UnitsInStock == 0 select p; Console.WriteLine("Sold out products:"); foreach (var product in soldOutProducts) { Console.WriteLine("{0} is sold out!", product.ProductName); }
คำอธิบาย : เป็นการดึงข้อมูลจาก object list ของคลาส Product มาแสดง โดยใช้ operator ที่ชื่อว่า Where ซึ่งมีลักษณะการใช้งานคำสั่งคล้ายกับในการเขียนคำสั่ง SQL ซึ่งเงื่อนไขที่ใช้ในการดึงข้อมูลคือจะต้องมีจำนวนใน stock เป็น 0 และนำชื่อของสินค้าที่หมดในสต็อกมาวนแสดงโดยเรียกใช้ properties ที่ชื่อว่า ProductName
ตัวอย่างที่ 2 : เป็นลักษณะการดึงข้อมูลแบบมีเงื่อนไขโดยใช้เมธอด Where
string[] digits = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; var shortDigits = digits.Where((digit, index) => digit.Length < index); Console.WriteLine("Short digits:"); foreach (var d in shortDigits) { Console.WriteLine("The word {0} is shorter than its value.", d); }
คำอธิบาย : จากตัวอย่างข้างต้น เป็นการดึงข้อมูลตามเงื่อนไข ด้วยเมธอด Where ซึ่งเงื่อนไขข้างต้นจะดึงข้อมูลเฉพาะรายการที่มีความยาวของตัวอักษรน้อยกว่าค่า index ของข้อมูลอาร์เรย์
- การเรียงลำดับข้อมูล
ตัวอย่างที่ 1 : เป็นการเรียงลำดับข้อมูลโดยทั่วไป ด้วยคีย์เวิร์ด Order by
var movies = from row in _db.Movies orderby row.Category, row.Name descending select row;
คำอธิบาย : จากตัวอย่างข้างต้น เป็นการดึงข้อมูลโดยมีการเรียงลำดับข้อมูลตามฟิลด์ Category และ Name ที่มีการเรียงลำดับจากมากไปน้อย ตามลำดับ โดย keyword ที่ใช้ในการเรียงลำดับ คือ เรียงจากน้อยไปมากใช้ ascending แต่หากต้องการเรียงลำดับจากมากไปน้อยให้ใช้ descending แต่หากไม่ระบุลักษณะการเรียงลำดับไว้ จะมีค่าตั้งต้นเป็นการเรียงลำดับจากน้อยไปมาก(ascending) นั่นเอง
ตัวอย่างที่ 2 : เป็นการเรียงลำดับของข้อมูลมากกว่า 1 คอลัมน์ ด้วยเมธอด OderBy และ ThenBy
var movies = _db.Movies.OrderBy(c => c.Category).ThenBy(n => n.Name)
คำอธิบาย : จากตัวอย่างข้างต้น เป็นการดึงข้อมูลโดยมีการเรียงลำดับข้อมูลตามฟิลด์ Category และ Name ที่มีการเรียงลำดับจากมากไปน้อย ตามลำดับ โดยใช้เมธอด OrderBy ตามด้วย ThenBy
- การจัดกลุ่มข้อมูล Group by
ตัวอย่างที่ 1 :
var orderGroups = from p in products group p by p.Category into g select new { Category = g.Key, Products = g };
คำอธิบาย : จากตัวอย่างข้างต้น เป็นการจัดกลุ่มข้อมูลด้วยฟิลด์ Category โดยใช้คีย์เวิร์ด group by
ตัวอย่างที่ 2 :
var query = source.GroupBy(x => new { x.Column1, x.Column2 });
คำอธิบาย : จากตัวอย่างข้างต้น เป็นการดึงข้อมูลแบบมีการจัดกลุ่มโดยใช้เมธอด GroupBy แบบมากกว่า 1 คอลัมน์
สำหรับบทความนี้ ผู้เขียนจะขอพูดถึงการใช้งานพื้นฐานของการเขียน LINQ เบื้องต้นไว้เพียงเท่านี้ก่อน แต่ในความเป็นจริงแล้วประโยชน์และความสามารถของ LINQ นี้ยังมีอีกมากมาย ซึ่งผู้เขียนจะขอหยิบยกและพูดถึงเพิ่มเติมในหัวข้อที่คิดว่าผู้พัฒนาน่าจะนำไปใช้ประโยชน์ได้เพิ่มเติมในบทความถัดไป(Ep.2) เช่น การกำจัดข้อมูลที่ซ้ำกัน การคำนวณค่าผลรวม และการเชื่อมข้อมูล(join) ตาราง เป็นต้น หากบทความนี้มีเนื้อหาหรือส่วนใดของบทความผิดพลาด ผู้เขียนขออภัยไว้ ณ ที่นี้ด้วย ทั้งนี้ผู้อ่านสามารถเสนอแนะและแลกเปลี่ยนความคิดเห็นร่วมกันได้ ขอบคุณค่ะ
ปล.อย่าลืมติดตามเนื้อหาต่อใน Ep.2 นะคะ ^^
แหล่งข้อมูลอ้างอิง :
https://code.msdn.microsoft.com/LINQ-Restriction-Operators-b15d29ca
http://stackoverflow.com/questions/847066/group-by-multiple-columns
Comments are closed.