Linq คืออะไร?
สำหรับการพัฒนาด้วย .net Framework แต่เดิมมีการติดต่อฐานข้อมูล ด้วย ADO.net โดยการใช้ Dataset กับ DataTable ซึ่งใช้ตั้งแต่ .net Framework 2.0 (หรือก่อนหน้านั้น) มาจนถึงปัจจุบัน .Net framework 4.5
และการติดต่อฐานข้อมูลรุ่นใหม่ที่มีการเริ่มใช้ตั้งแต่ .net framework 3.5 Sp1 นั่นก็คือ Entity Framework แต่ว่า ภายใน Entity Framework นั้นจะมี รูปแบบการเขียน Query ที่แตกต่างจาก ภาษา SQL ทั่วไป โดยภาษาที่เขียนนั้น เรียกว่า "LINQ to sql" ผมจะขออธิบายตั้งแต่การเขียนแบบ ติดต่อแบบ DataTable นะครับ
การเขียน แบบ DataSet นั้นมีรูปแบบการเขียน ติดต่อกับฐานข้อมูลคร่าวๆ ดังนี้
string str_query = "SELECT * FROM PRODUCT";
string str_conn = "SERVER=(LOCAL);user=sa;password=xxxx";
SqlConnection sqlcon = new SqlConnection(str_conn);
SqlDataAdapter adap = new SqlDataAdapter(str_query, sqlcon);
DataTable dt_item = new DataTable();
adap.Fill(dt_item);
การเขียนโดยใช้ DataSet หรือ DataTable นั้นจะ Return กลับมาอยู่ในรูปแบบของ Table อิสระที่มี Row และ Column เป็น อิสระ การเรียกใช้นั้นมีหลายรูปแบบ เช่น
Datagrid1.DataSource= dt;
string str_pid= dt.Rows[0]["Pd_id"].ToString();
เป็นต้น
จากรูปแบบข้างต้นจะสังเกตว่า DataTable นั้นจะมีคีย์สองตัวัน่นคือ Row และ Column ซึ่ง Column นั้นถ้าจะให้แม่นจำเป็นจะต้องใช้ในรูปแบบของ String Key ซึ่งนี่เองที่เป็นหนึ่งในจุดอ่อนและจุดยุุ่งยากทำให้โปรแกรมเมอร์ .net มักจะผิดพลาดกันได้เยอะมาก และยิ่งเป็น Case Sensitive ด้วยแล้วยิ่งไปกันใหญ่
แต่ว่าจุดอ่อนนี้ได้ถูกแก้ไข แล้วด้วย LINQ นั่นเอง
Linq เป็น ภาษารูปแบบหนึ่งที่ ไมโครซอฟท์สร้างขึ้นมา เพื่ออำนวยความสะดวกให้กับโปรแกรมเมอร์ทุกคน สามารถ Implement ติดต่อ Query ได้ง่ายขึ้น ทำให้แยกส่วน ระหว่าง Syntax ของการ Query กับ Object ลงอย่างสิ้นเชิง
ตัวอย่าง เช่น
SQL Query = "SELECT * FROM products";
LINQ =(from c in db.products).ToList();//
ตัวอย่างข้างต้นคือรูปแบบการ Select * from [tables] ที่แตกต่างจากรูปแบบทั่วไป โดย LINQ จะอยู่ในรูปแบบของ Object<IQueryable> ที่สามารถนำไปใช้ได้อย่างง่ายดายตัวอย่างการเขียนแบบ เต็มของ LINQ
using (var c = new Models())
{
var items= c.tb_products.ToList();
}
(ต้องมีการ using System.Linq; ด้วย)
การใช้ .ToList() จะทำให้ผลล้ัพธ์ที่ได้อยู่ในรูปแบบของ List<T>(); T= Object ต่างๆ เช่น Product เป็นต้น
การใช้ Linq ผลลัพธ์นั้นจะออกมาในรูปแบบของ List ที่เป็น Object ข้อดีนั้นคือความง่ายของการเป็น Object จะลดความผิดพลาดของการผิด Syntax ลง เช่น var pd = product[0].pd_id; เป็นต้น
การเขียนนั้นพออยู่ในรูปแบบของ object ทำให้การอ้างอิงถึง Field หรือ Property ทำได้ง่ายขึ้น ลดความผิดพลาดของการอ้างอิงลง และทำให้การพัฒนามีความเร็วมากขึ้น
การเขียนรูปแบบสองอย่างระหว่าง DataTable และ Linq นั้นมีข้อดีข้อเสียต่างกัน ขอแสดงให้ดูดังนี้
ข้อเสียของ Linq to sql
1) หากไม่เคยเรียนรู้มา ต้องนั่งเรียนรู้ใหม่
2) การทำบางฟังก์ชั่น เช่น groupby มีความยุ่งยาก ในการเขียน
3) การ join สามารถทำได้ทั้ง left,right และ inner join แต่ทว่า syntax อาจจะทำให้ปวดหัวกันไปเลยเดียว ฉะนั้น หากใช้ควรเลี่ยงด้วยการไปทำเป็น Store หรือ View ในส่วนของ query แล้วดึงมาจะสะดวกและเร็วกว่าการนั่งเขียนพวกนี้เอง
4) มีความเร็วช้ากว่า DataTable เพราะจำเป็นจะต้องแปลง Syntax เป็น SQL อีกที จึงจะ Query แล้วจึง Return มา ก็ต้องแปลงให้อยู่ในรูปแบบของ Object อีกครั้ง
5) ไม่ยืดหยุ่นเท่ากับ DataTable ข้อนี้ เป็นจุดเสียที่ เรียกว่า อยู่ในข้อดีเลยทีเดียวเพราะจุดเสียคือไม่ Dynamic เท่าไร ทำให้การเขียนต้องใช้ OpenSource นอกอย่าง AutoMapper เพื่อให้ทำงายง่ายหรือพัฒนาขึ้นมาเอง สำหรับการ Mapping Field
ข้อดีของ Linq to sql
1) หากเป็นแล้วทำให้การพัฒนาเร็วกกว่าการเขียนกับ Datatable
2) Syntax ของ Entity Framework มาจาก Microsoft ที่ใครที่เป็นก็สามารถต่อยอดและไล่ได้ง่าย
3) การทำ CRUD และ การใช้ StoreProcedure ง่าย
4) มีการ Provide Transaction ไว้ให้
5) เช็ค null, empty ได้ง่ายกว่า DataTable
6) สามารถ where หา ข้อมูลใน List ผลลัพธ์ได้ง่ายเพียงใช้ Syntax ของ Linq เช่น c.where(c=>c.id==1).FirstOrDefault(); แค่นี้ก็ได้มาแถวนึงแล้ว
7) Tool อ้างอิง EntityFramework ทำให้การจัดการแยกชัดเจนระหว่าง Database และ Code จึงง่ายต้องการ Management ระหวว่าง code กับ Databaseเช่น มีการเพิ่มคอลัมภ์ ใหม่เข้าไป หรือเปลี่ยนแปลง ชื่อฟิลด์ หากเป็น SQL Syntax จะปล่อยให้ผ่านไปเลยแต่หากเป็น EntityFramework จะ Error ฟ้องขึ้นมาทำให้ง่ายต่อการแก้ไข และจัดการ
ทีนี้มาถึง DataTable นะครับ
ข้อดี
1) ยืดหยุ่นสูง
2) ไม่ต้องใช้ Tools มากมาย ส่วนใหญ่จะมีคลาสกลางเป็น Connection และ Unity สำหรับจัดการก็เพียงพอแล้ว
3) มีความเร็วมากกว่า Linq
ข้อเสีย
1) Syntax เป็น String และ Case sensitive ด้วยการที่ เป้น string ทำให้เวลาผิดพลาดเราก็ไม่รู้ต้องรอจนรันไปถึงจึงจะ Error ให้เห็น
2) มีปัญหากับ Null ในการเช็ค
3) String จำนวนหลายแห่งอาจจะทำให้การพิมพ์ตกหรือหล่นได้
คำสั่งพื้นฐานของ Linq to sql
Table : tb_items
SELECT * FROM tb_items : (from c in db.tb_items).ToList();
SELECT * FROM tb_items where pd_id=1 : (from c in db.tb_items where c.pd_id==1).ToList();
SELECT TOP 1 From tb_item : (from c in db_items).FirstOrDefault();
SELECT TOP 10 From tb_item : (from c in db_items).Take(10).ToList();
SELECT Distinct * From tb_item : (from c in db_items).Distinct().ToList();
SELECT pd_id,pd_name FROM tb_item : (from c in db_items select c.pd_id,c.pd_name).ToList();
ไม่มีความคิดเห็น:
แสดงความคิดเห็น