LINQ (Language Integrated Query) คือ การทำให้เราสามารถใช้ภาษา C# หรือ VB.NET ในการดึงข้อมูลจาก Database แทนการใช้ SQL statement ซึ่งทำให้ Programmer สามารถเขียนโปรแกรม แบบเป็น Object-Oriented มากขึ้น
เรามาดูตัวอย่างกันซักหน่อย สมมุติว่าเรามี Table ที่ชื่อ Person อยู่ใน Database
เรามาดูตัวอย่างกันซักหน่อย สมมุติว่าเรามี Table ที่ชื่อ Person อยู่ใน Database
เราสามารถดึงข้อมูลทั้งหมดของ Table Person ได้ด้วยการใช้คำสั่ง
[C#]
SampleDataContext ctx = new SampleDataContext(); // สร้าง repository ของข้อมูล
var person = from p in ctx.Persons // ดึงข้อมูล Person ทั้งหมดออก
select p; // มาจาก repository
เห็น Syntax ของ C# แปลกๆ อย่างนี้ อย่าเพิ่งตกใจนะคับ มันเป็นการเขียนโดยใช้ Syntax ของ Lamda Expression (ไว้จะเอาไว้อธิบายในครั้งต่อๆไป) แต่จะเห็นว่ามันคล้ายๆกับ Syntax ของ SQL ซึ่งจาก Code ข้างต้นจะทำให้ได้ผลลัพธ์ จะเหมือนกับ
[SQL]
Select *
From CCD_Person
นอกจากเรื่องความสามารถในการใช้ภาษา C# หรือ VB.NET ดึงข้อมูลขึ้นมาแล้ว LINQ ยังมีความสามารถในการ Update ข้อมูลต่างๆที่ เพิ่ม แก้ไข หรือลบ ลงไปยัง Database โดยอัตโนมัติด้วยการใช้ Pattern "Unit of Work"
แล้วไอ้ Unit of Work มันคืออะไรล่ะ?
Unit of Work คือ การรวบรวมข้อมูลทั้งหมดที่เกิดขึ้นในช่วงเวลาต่างๆ มาตรวจสอบแล้วนำค่าข้อมูลเหล่านั้นไปทำงานตามข้อมูลที่เปลี่ยนไปภายในครั้งเดียวกัน
ยิ่งอธิบายยิ่งงง เราไปดูตัวอย่างดีกว่า
จากข้อมูล Person ที่เราได้ดึงขึ้นมาข้างต้นเราจะทำการ Update กลับไปยัง Database ดังนี้
[C#]
int i =0;
foreach(Person p in person)
{
p.NickName = p.Nickname + i.ToString();
i++;
}
Person p = new Person();
p.FirstName = "Hello"
p.LastName = "World";
ctx.Persons.add(p);
ctx.SubmitChanges();
จาก Code ข้างต้น จะเห็นว่ามีแก้ไขค่า NickName ของทุก Entity นอกจากนั้นยังได้ทำการเพิ่ม Entity ใหม่ที่มี Firstname = "Hello" และ LastName = "World" หลังจากนั้นก็ไปทำการเรียก Method ที่ชื่อว่า SubmitChanges ซึ่งไอ้ method submitChanges นี่แหละที่จะทำให้ LINQ ทำการตรวจสอบว่ามี entity ใดบ้างที่ถูกแก้ไข, เพิ่ม หรือลบ ออกจาก Repository(ในที่นี้คือ ctx) บ้าง แล้วนำข้อมูลทั้งหมดที่ถูกแก้ไขไป Update ลงไปใน Database ให้โดยอัตโนมัติ
จากที่กล่าวมาทั้งหมดเป็นความสามารถเบื้องต้นของ LINQ โดยตัว LINQ เองมันได้แบ่งออกเป็น 3 ประเภทหลักๆ คือ
1. LINQ to XML
2. LINQ to SQL
3. LINQ to Entity (ADO.NET Entity Framework)
ซึ่งผมจะพยายามเอามารายละเอียดมาอธิบายในครั้งต่อๆไปนะคับ
[C#]
SampleDataContext ctx = new SampleDataContext(); // สร้าง repository ของข้อมูล
var person = from p in ctx.Persons // ดึงข้อมูล Person ทั้งหมดออก
select p; // มาจาก repository
เห็น Syntax ของ C# แปลกๆ อย่างนี้ อย่าเพิ่งตกใจนะคับ มันเป็นการเขียนโดยใช้ Syntax ของ Lamda Expression (ไว้จะเอาไว้อธิบายในครั้งต่อๆไป) แต่จะเห็นว่ามันคล้ายๆกับ Syntax ของ SQL ซึ่งจาก Code ข้างต้นจะทำให้ได้ผลลัพธ์ จะเหมือนกับ
[SQL]
Select *
From CCD_Person
นอกจากเรื่องความสามารถในการใช้ภาษา C# หรือ VB.NET ดึงข้อมูลขึ้นมาแล้ว LINQ ยังมีความสามารถในการ Update ข้อมูลต่างๆที่ เพิ่ม แก้ไข หรือลบ ลงไปยัง Database โดยอัตโนมัติด้วยการใช้ Pattern "Unit of Work"
แล้วไอ้ Unit of Work มันคืออะไรล่ะ?
Unit of Work คือ การรวบรวมข้อมูลทั้งหมดที่เกิดขึ้นในช่วงเวลาต่างๆ มาตรวจสอบแล้วนำค่าข้อมูลเหล่านั้นไปทำงานตามข้อมูลที่เปลี่ยนไปภายในครั้งเดียวกัน
ยิ่งอธิบายยิ่งงง เราไปดูตัวอย่างดีกว่า
จากข้อมูล Person ที่เราได้ดึงขึ้นมาข้างต้นเราจะทำการ Update กลับไปยัง Database ดังนี้
[C#]
int i =0;
foreach(Person p in person)
{
p.NickName = p.Nickname + i.ToString();
i++;
}
Person p = new Person();
p.FirstName = "Hello"
p.LastName = "World";
ctx.Persons.add(p);
ctx.SubmitChanges();
จาก Code ข้างต้น จะเห็นว่ามีแก้ไขค่า NickName ของทุก Entity นอกจากนั้นยังได้ทำการเพิ่ม Entity ใหม่ที่มี Firstname = "Hello" และ LastName = "World" หลังจากนั้นก็ไปทำการเรียก Method ที่ชื่อว่า SubmitChanges ซึ่งไอ้ method submitChanges นี่แหละที่จะทำให้ LINQ ทำการตรวจสอบว่ามี entity ใดบ้างที่ถูกแก้ไข, เพิ่ม หรือลบ ออกจาก Repository(ในที่นี้คือ ctx) บ้าง แล้วนำข้อมูลทั้งหมดที่ถูกแก้ไขไป Update ลงไปใน Database ให้โดยอัตโนมัติ
จากที่กล่าวมาทั้งหมดเป็นความสามารถเบื้องต้นของ LINQ โดยตัว LINQ เองมันได้แบ่งออกเป็น 3 ประเภทหลักๆ คือ
1. LINQ to XML
2. LINQ to SQL
3. LINQ to Entity (ADO.NET Entity Framework)
ซึ่งผมจะพยายามเอามารายละเอียดมาอธิบายในครั้งต่อๆไปนะคับ