แอปพลิเคชันส่วนใหญ่จะเน้นข้อมูลเป็นหลัก แต่คลังข้อมูลส่วนใหญ่เป็นฐานข้อมูลเชิงสัมพันธ์ ในช่วงหลายปีที่ผ่านมา นักออกแบบและนักพัฒนาได้ออกแบบแอปพลิเคชันตามโมเดลออบเจ็กต์
ออบเจ็กต์มีหน้าที่รับผิดชอบในการเชื่อมต่อส่วนประกอบที่เข้าถึงข้อมูล - เรียกว่า Data Access Layer (DAL) ที่นี่เราต้องพิจารณาสามประเด็น:
ข้อมูลทั้งหมดที่แอปพลิเคชันต้องการไม่จำเป็นต้องจัดเก็บไว้ในแหล่งข้อมูลเดียว ทรัพยากรนี้อาจเป็นฐานข้อมูลเชิงสัมพันธ์ วัตถุทางธุรกิจ ไฟล์ XML หรือเว็บเซิร์ฟเวอร์
การเข้าถึงอ็อบเจ็กต์ในหน่วยความจำนั้นง่ายกว่าและราคาถูกกว่าการเข้าถึงข้อมูลในฐานข้อมูลและไฟล์ XML
ข้อมูลที่เข้าถึงไม่ได้ใช้โดยตรง แต่ถูกทิ้ง จัดเรียง จัดกลุ่ม แก้ไข ฯลฯ
ดังนั้น มันจะมีประโยชน์มากหากมีเครื่องมือที่สามารถรวมข้อมูลทุกประเภทได้อย่างง่ายดายด้วยโค้ดเพียงไม่กี่บรรทัด - เครื่องมือที่สามารถรวมข้อมูลจากแหล่งต่างๆ และสามารถดำเนินการกับข้อมูลพื้นฐานได้
Language Integrated Query (LINQ) เป็นหนึ่งในเครื่องมือดังกล่าว LINQ เป็นส่วนขยายของ .NET Framework 3.5 และภาษาการจัดการทำให้การสืบค้นมีลักษณะคล้ายกับวัตถุมากขึ้น มันกำหนดไวยากรณ์ทั่วไปและโมเดลโปรแกรมที่ช่วยให้เราใช้ไวยากรณ์สำนวนเพื่อค้นหาข้อมูลประเภทต่างๆ ให้เสร็จสิ้น
การดำเนินการที่เกี่ยวข้อง เช่น การค้นหา โปรเจ็กต์ ลิงก์ กลุ่ม พาร์ติชัน การดำเนินการตั้งค่า ฯลฯ สามารถใช้ใน LINQ ได้ และคอมไพเลอร์ C# และ VB ใน .NET Framework 3.5 รองรับไวยากรณ์ LINQ ซึ่งช่วยให้สามารถจัดเก็บข้อมูลการกำหนดค่า โดยไม่ต้องใช้วิธีอื่น ADO.NET.
ตัวอย่างเช่น หากต้องการสอบถามตาราง Consumers ในฐานข้อมูล Northwind โดยใช้ LINQ ใน C# โค้ดควรเป็นดังนี้:
var data = จาก c ใน dataContext.Customerswhere c.Country == "สเปน"เลือก c;
ใน:
คำหลัก from จะส่งผ่านแต่ละคอลเลกชันตามลำดับตามตรรกะ
นิพจน์ที่มีคำสำคัญที่เปรียบเทียบแต่ละออบเจ็กต์ในคอลเลกชัน
คำสั่ง select จะเลือกวัตถุที่เปรียบเทียบและเพิ่มลงในรายการและส่งคืน
คำหลัก var ใช้สำหรับการประกาศตัวแปร เนื่องจากประเภทที่แน่นอนของออบเจ็กต์ที่ส่งคืนไม่ชัดเจน จึงบ่งชี้ว่าข้อมูลจำเป็นต้องอนุมานแบบไดนามิก
คำสั่งสืบค้น LINQ สามารถนำไปใช้กับคลาสที่รองรับข้อมูลใดๆ ที่สืบทอดมาจาก IEnumerable โดยที่ T อาจเป็นประเภทข้อมูลใดก็ได้ เช่น List<Book>
ลองดูตัวอย่างเพื่อทำความเข้าใจแนวคิด คลาสต่อไปนี้ถูกใช้ในตัวอย่าง: Book.cs
หนังสือคลาสสาธารณะ {get; set;} public string Title { get; set; } public static list<Books> GetBooks() { รายการ<หนังสือ> รายการ = รายการใหม่<หนังสือ>(); list.Add(หนังสือใหม่ { ID = "001", ชื่อ = "การเขียนโปรแกรมใน C#", ราคา = 634.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(หนังสือใหม่ { ID = "002", หัวข้อ = "เรียนรู้ Jave ใน 30 วัน", ราคา = 250.76m, DateOfRelease = Convert.ToDateTime ("2011-08-15") }); list.Add(หนังสือใหม่ { ID = "003", Title = "การเขียนโปรแกรมใน ASP.Net 4.0", ราคา = 700.00m, DateOfRelease = Convert.ToDateTime("2011-02-05") }); list.Add(หนังสือใหม่ { ID = "004", หัวข้อ = "VB.Net Made Easy", ราคา = 500.99m, DateOfRelease = Convert.ToDateTime("2011-12-31") }); list.Add(หนังสือใหม่ { ID = "005", ชื่อ = "การเขียนโปรแกรมในภาษา C", ราคา = 314.76m, DateOfRelease = Convert.ToDateTime("2010- 02-05") }); list.Add(หนังสือใหม่ { ID = "006", Title = "การเขียนโปรแกรมใน C++", Price = 456.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(หนังสือใหม่ { ID = "007", Title = "Datebase Development", ราคา = 1,000.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); กลับ รายการ; }}
ใช้คลาสนี้ในหน้าเว็บเพื่อให้มีการควบคุมป้ายกำกับอย่างง่ายเพื่อแสดงชื่อหนังสือ เมธอด Page_Load จะสร้างรายการหนังสือและส่งกลับชื่อหนังสือโดยใช้แบบสอบถาม LINQ:
simplequery คลาสสาธารณะบางส่วน: System.Web.UI.Page { ป้องกันเป็นโมฆะ Page_Load (ผู้ส่งวัตถุ EventArgs e) { รายการ <หนังสือ> หนังสือ = Books.GetBooks (); var booktitles = จาก b ในหนังสือ เลือก b.Title; var title ในหนังสือ) lblbooks.Text += String.Format("{0} <br />", title); }}
เมื่อเว็บเพจทำงาน แท็กจะแสดงผลลัพธ์การสืบค้น:
นิพจน์ LINQ ด้านบน:
var booktitles = จาก b ในหนังสือ เลือก b.Title;
เทียบเท่ากับคำสั่ง SQL ต่อไปนี้:
เลือกชื่อเรื่องจากหนังสือ
นอกจากตัวดำเนินการที่ใช้จนถึงตอนนี้แล้ว ยังมีตัวดำเนินการอื่นๆ อีกมากมายที่จะดำเนินการคำสั่งย่อยของแบบสอบถาม ลองดูที่ตัวดำเนินการและส่วนคำสั่งบางตัว
'ส่วนคำสั่งเข้าร่วม' ใน SQL ใช้เพื่อรวมตารางข้อมูลสองตารางและแสดงการรวบรวมข้อมูลในคอลัมน์ที่ปรากฏในตารางข้อมูลทั้งสอง LINQ ยังสามารถรองรับฟังก์ชันการทำงานนี้ได้ หากต้องการตรวจสอบ ให้เพิ่มคลาสอื่นชื่อ Saledetails.cs ไปยังโปรเจ็กต์ก่อนหน้า:
Salesdetails สาธารณะ { รับ; ชุดสาธารณะ { รับ; ชุด; } IEnumerable แบบคงที่สาธารณะ getsalesdetails () { รายละเอียดการขาย [] ID = "001", หน้า = 678, ยอดขาย = 110000}, รายละเอียดการขายใหม่ { ID = "002", หน้า = 789 ยอดขาย = 60000} รายละเอียดการขายใหม่ { ID = "003" หน้า = 456 ยอดขาย = 40000} รายละเอียดการขายใหม่ { ID = "004" หน้า = 900 ยอดขาย = 80000} รายละเอียดการขายใหม่ { ID = "005", หน้า = 456, ยอดขาย = 90000}, รายละเอียดการขายใหม่ { ID = "006", หน้า = 870, ยอดขาย = 50,000, รายละเอียดการขายใหม่ { ID = "007", หน้า = 675, ยอดขาย = 40000}, }; return sd.OfType<Salesdetails>( }}
เพิ่มโค้ดในฟังก์ชัน Page_Load เพื่อตอบแบบสอบถามบนสองตารางโดยใช้การประมวลผลส่วนคำสั่งแบบรวม:
ป้องกัน void Page_Load(ผู้ส่งวัตถุ EventArgs e){ IEnumerable<Books> books = Books.GetBooks(); IEnumerable<Salesdetails> sales = Salesdetails.getsalesdetails(); var booktitles = จาก b ในหนังสือ เข้าร่วม s ในการขายบน b.ID เท่ากับ s.ID เลือกใหม่ { Name = b.Title, Pages = s.pages }; foreach (var title in ชื่อหนังสือ) lblbooks.Text += String.Format("{0} <br />", title);}
หน้าผลลัพธ์จะแสดงดังนี้:
โดยที่ส่วนคำสั่งอนุญาตให้เพิ่มเงื่อนไขการกรองลงในแบบสอบถาม ตัวอย่างเช่น หากคุณต้องการได้รับบรรณานุกรมที่มีมากกว่า 500 หน้า คุณสามารถเปลี่ยนหมายเลขอ้างอิงในวิธี Page_Load ให้มีลักษณะดังนี้:
var booktitles = จาก b ในหนังสือ เข้าร่วม s ในการขายบน b.ID เท่ากับ s.ID โดยที่ s.pages > 500 เลือกใหม่ { Name = b.Title, Pages = s.pages };
ข้อความค้นหาจะแสดงเฉพาะคอลัมน์ที่มีจำนวนหน้ามากกว่า 500 เท่านั้น:
ส่วนคำสั่งเหล่านี้อนุญาตให้เรียงลำดับผลลัพธ์ของแบบสอบถามได้ หากต้องการค้นหาชื่อเรื่อง หมายเลขหน้า และราคาหนังสือ และจัดเรียงตามราคา ให้เขียนโค้ดต่อไปนี้ในส่วนแฮนเดิลของเมธอด Page_Load:
var booktitles = จาก b ในหนังสือ เข้าร่วม s ในการขายบน b.ID เท่ากับ s.ID orderby b.Price เลือกใหม่ { Name = b.Title, Pages = s.pages, Price = b.Price};
tuple ที่ส่งคืนคือ:
Let clause อนุญาตให้กำหนดตัวแปรและกำหนดค่าที่คำนวณจากข้อมูลให้กับตัวแปรนั้น ตัวอย่างเช่น ในการคำนวณมูลค่ายอดขายรวมจากมูลค่าการขายสองมูลค่าข้างต้น คุณต้องคำนวณดังนี้:
TotalSale = ราคาหนังสือ * ยอดขาย
เพื่อให้สมการนี้สมบูรณ์ ให้เพิ่มส่วนย่อยโค้ดต่อไปนี้ที่หมายเลขอ้างอิงของวิธี Page_Load:
Let clause อนุญาตให้กำหนดตัวแปรและกำหนดค่าที่คำนวณจากข้อมูลให้กับตัวแปรนั้น ตัวอย่างเช่น ในการคำนวณมูลค่ายอดขายรวมจากมูลค่าการขายสองมูลค่าข้างต้น คุณต้องคำนวณดังนี้:
var booktitles = จาก b ในหนังสือ เข้าร่วม s ในการขายบน b.ID เท่ากับ s.ID ให้ Totalprofit = (b.Price * s.sales) เลือกใหม่ { Name = b.Title, TotalSale = Totalprofit};
ผลลัพธ์การสืบค้นมีดังนี้: