Entity Framework - แบบสอบถามการฉายภาพ
LINQ ถึงเอนทิตี
แนวคิดที่สำคัญที่สุดอย่างหนึ่งในการทำความเข้าใจ LINQ to Entities คือภาษาที่ใช้ในการประกาศ โฟกัสอยู่ที่การกำหนดว่าคุณต้องการข้อมูลอะไรมากกว่าที่จะได้รับข้อมูล
หมายความว่าคุณสามารถใช้เวลาในการทำงานกับข้อมูลได้มากขึ้นและใช้เวลาน้อยลงในการพยายามหารหัสพื้นฐานที่จำเป็นในการทำงานเช่นการเข้าถึงฐานข้อมูล
สิ่งสำคัญคือต้องเข้าใจว่าภาษาที่ใช้ในการประกาศไม่ได้ลบการควบคุมใด ๆ จากนักพัฒนา แต่จะช่วยให้นักพัฒนามุ่งความสนใจไปที่สิ่งที่สำคัญ
LINQ to Entities คีย์เวิร์ดสำคัญ
สิ่งสำคัญคือต้องทราบคำหลักพื้นฐานที่ใช้ในการสร้างแบบสอบถาม LINQ มีคำหลักเพียงไม่กี่คำที่ต้องจำ แต่คุณสามารถรวมเข้าด้วยกันได้หลายวิธีเพื่อให้ได้ผลลัพธ์ที่เฉพาะเจาะจง รายการต่อไปนี้ประกอบด้วยคำหลักพื้นฐานเหล่านี้และให้คำอธิบายง่ายๆของแต่ละคำ
เลขที่ | คำหลักและคำอธิบาย |
---|---|
1 | Ascending ระบุว่าการดำเนินการเรียงลำดับเกิดขึ้นจากองค์ประกอบน้อยที่สุด (หรือต่ำสุด) ของช่วงถึงองค์ประกอบสูงสุดของช่วง โดยปกติเป็นการตั้งค่าเริ่มต้น ตัวอย่างเช่นเมื่อทำการเรียงลำดับตามตัวอักษรการเรียงลำดับจะอยู่ในช่วงตั้งแต่ A ถึง Z |
2 | By ระบุฟิลด์หรือนิพจน์ที่ใช้ในการจัดกลุ่ม ฟิลด์หรือนิพจน์กำหนดคีย์ที่ใช้เพื่อดำเนินการจัดกลุ่ม |
3 | Descending ระบุว่าการดำเนินการเรียงลำดับเกิดขึ้นจากองค์ประกอบที่ยิ่งใหญ่ที่สุด (หรือสูงสุด) ของช่วงไปยังองค์ประกอบต่ำสุดของช่วง ตัวอย่างเช่นเมื่อทำการเรียงลำดับตามตัวอักษรการเรียงลำดับจะอยู่ในช่วงตั้งแต่ Z ถึง A |
4 | Equals ใช้ระหว่างส่วนคำสั่งด้านซ้ายและด้านขวาของคำสั่ง join เพื่อรวมแหล่งข้อมูลตามบริบทหลักกับแหล่งข้อมูลบริบทรอง ฟิลด์หรือนิพจน์ทางด้านซ้ายของคีย์เวิร์ดเท่ากับระบุแหล่งข้อมูลหลักในขณะที่ฟิลด์หรือนิพจน์ทางด้านขวาของคีย์เวิร์ดเท่ากับระบุแหล่งข้อมูลรอง |
5 | From ระบุแหล่งข้อมูลที่ใช้เพื่อรับข้อมูลที่ต้องการและกำหนดตัวแปรช่วง ตัวแปรนี้มีจุดประสงค์เดียวกับตัวแปรที่ใช้สำหรับการวนซ้ำ |
6 | Group จัดระเบียบเอาต์พุตเป็นกลุ่มโดยใช้ค่าคีย์ที่คุณระบุ ใช้คำสั่งกลุ่มหลายกลุ่มเพื่อสร้างองค์กรเอาต์พุตหลายระดับ ลำดับของประโยคกลุ่มจะกำหนดความลึกที่ค่าคีย์หนึ่ง ๆ ปรากฏในลำดับการจัดกลุ่ม คุณรวมคำหลักนี้เข้ากับโดยเพื่อสร้างบริบทเฉพาะ |
7 | In ใช้ในหลายวิธี ในกรณีนี้คีย์เวิร์ดจะกำหนดแหล่งฐานข้อมูลบริบทที่ใช้สำหรับคิวรี เมื่อทำงานกับการเข้าร่วมคีย์เวิร์ด in จะถูกใช้สำหรับแหล่งฐานข้อมูลบริบทแต่ละแหล่งที่ใช้สำหรับการเข้าร่วม |
8 | Into ระบุตัวระบุที่คุณสามารถใช้เป็นข้อมูลอ้างอิงสำหรับส่วนคำสั่งการสืบค้น LINQ เช่นเข้าร่วมกลุ่มและเลือก |
9 | Join สร้างแหล่งข้อมูลเดียวจากแหล่งข้อมูลที่เกี่ยวข้องสองแหล่งเช่นในการตั้งค่าหลัก / รายละเอียด การรวมสามารถระบุการรวมภายในกลุ่มหรือการรวมด้านซ้ายโดยให้การรวมภายในเป็นค่าเริ่มต้น คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการรวมได้ที่msdn.microsoft.com |
10 | Let กำหนดตัวแปรช่วงที่คุณสามารถใช้เพื่อเก็บผลลัพธ์นิพจน์ย่อยในนิพจน์แบบสอบถาม โดยทั่วไปแล้วตัวแปร range จะใช้เพื่อจัดเตรียมเอาต์พุตที่แจกแจงเพิ่มเติมหรือเพื่อเพิ่มประสิทธิภาพของการสืบค้น (เพื่อให้งานเฉพาะเช่นการค้นหาค่าตัวพิมพ์เล็กของสตริงไม่จำเป็นต้องทำมากกว่าหนึ่งครั้ง) |
11 | On ระบุฟิลด์หรือนิพจน์ที่ใช้เพื่อใช้การรวม ฟิลด์หรือนิพจน์กำหนดองค์ประกอบที่ใช้ร่วมกันกับแหล่งข้อมูลตามบริบททั้งสอง |
12 | Orderby สร้างลำดับการจัดเรียงสำหรับแบบสอบถาม คุณสามารถเพิ่มคีย์เวิร์ดจากน้อยไปมากหรือมากไปหาน้อยเพื่อควบคุมลำดับของการจัดเรียง ใช้ประโยคคำสั่งหลายคำสั่งเพื่อสร้างการเรียงลำดับหลายระดับ ลำดับของคำสั่ง orderby จะกำหนดลำดับการจัดการนิพจน์การเรียงลำดับดังนั้นการใช้ลำดับที่แตกต่างกันจะทำให้ได้ผลลัพธ์ที่แตกต่างกัน |
13 | Where กำหนดสิ่งที่ LINQ ควรดึงจากแหล่งข้อมูล คุณใช้นิพจน์บูลีนอย่างน้อยหนึ่งรายการเพื่อกำหนดลักษณะเฉพาะของสิ่งที่จะดึงข้อมูล นิพจน์บูลีนถูกแยกออกจากกันโดยใช้เครื่องหมาย && (AND) และ || (หรือ) ตัวดำเนินการ |
14 | Select กำหนดผลลัพธ์จากแบบสอบถาม LINQ โดยระบุข้อมูลที่จะส่งคืน คำสั่งนี้กำหนดชนิดข้อมูลขององค์ประกอบที่ LINQ ส่งกลับระหว่างกระบวนการวนซ้ำ |
การฉายภาพ
แบบสอบถามการฉายภาพช่วยเพิ่มประสิทธิภาพของแอปพลิเคชันของคุณโดยการดึงเฉพาะฟิลด์ที่ระบุจากฐานข้อมูลของคุณ
เมื่อคุณมีข้อมูลแล้วคุณอาจต้องการฉายหรือกรองตามความจำเป็นเพื่อกำหนดรูปร่างข้อมูลก่อนที่จะส่งออก
งานหลักของนิพจน์ LINQ to Entities คือการรับข้อมูลและจัดเตรียมเป็นเอาต์พุต
ส่วน“ การพัฒนา LINQ to Entities queries” ของบทนี้จะแสดงเทคนิคในการปฏิบัติงานพื้นฐานนี้
ลองมาดูโค้ดต่อไปนี้ว่าจะเรียกข้อมูลรายชื่อนักเรียนใดบ้าง
using (var context = new UniContextEntities()) {
var studentList = from s in context.Students select s;
foreach (var student in studentList) {
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
}
}
วัตถุเดี่ยว
ในการดึงอ็อบเจ็กต์นักเรียนเดี่ยวคุณสามารถใช้วิธีการนับ First () หรือ FirstOrDefault ซึ่งส่งคืนองค์ประกอบแรกของลำดับ ความแตกต่างระหว่าง First และ FirstOrDefault คือ First () จะทำให้เกิดข้อยกเว้นหากไม่มีข้อมูลผลลัพธ์สำหรับเกณฑ์ที่ให้มาในขณะที่ FirstOrDefault () จะส่งคืนค่าเริ่มต้นเป็นค่าว่างหากไม่มีข้อมูลผลลัพธ์ ในข้อมูลโค้ดด้านล่างนี้นักเรียนคนแรกจากรายชื่อจะถูกดึงข้อมูลซึ่งมีชื่อแรกคือ Ali
using (var context = new UniContextEntities()) {
var student = (from s in context.Students where s.FirstMidName
== "Ali" select s).FirstOrDefault<Student>();
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
}
คุณยังสามารถใช้ Single () หรือ SingleOrDefault เพื่อรับอ็อบเจ็กต์นักเรียนเดี่ยวซึ่งส่งคืนองค์ประกอบเดียวที่เฉพาะเจาะจงของลำดับ ในตัวอย่างต่อไปนี้นักเรียนคนเดียวจะถูกดึงข้อมูลซึ่งมี ID คือ 2
using (var context = new UniContextEntities()) {
var student = (from s in context.Students where s.ID
== 2 select s).SingleOrDefault<Student>();
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
Console.ReadKey();
}
รายชื่อวัตถุ
หากคุณต้องการดึงข้อมูลรายชื่อนักเรียนที่มีนามสกุลของ Ali คุณสามารถใช้ ToList () วิธีการแจงนับ
using (var context = new UniContextEntities()) {
var studentList = (from s in context.Students where s.FirstMidName
== "Ali" select s).ToList();
foreach (var student in studentList) {
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
}
Console.ReadKey();
}
ใบสั่ง
ในการดึงข้อมูล / รายการตามลำดับใด ๆ คุณสามารถใช้คำหลัก orderby ในรหัสต่อไปนี้รายชื่อตัวอย่างของนักเรียนจะถูกเรียกดูตามลำดับจากน้อยไปมาก
using (var context = new UniContextEntities()) {
var studentList = (from s in context.Students orderby
s.FirstMidName ascending select s).ToList();
foreach (var student in studentList) {
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
}
Console.ReadKey();
}
แบบสอบถามกรอบเอนทิตีมาตรฐาน Vs
สมมติว่าคุณมีโมเดล Student ที่มี ID, FirstMidName, LastName และ EnrollmentDate ถ้าคุณต้องการส่งคืนรายชื่อนักเรียนแบบสอบถามมาตรฐานจะส่งคืนฟิลด์ทั้งหมด แต่ถ้าคุณต้องการรับเฉพาะรายชื่อนักเรียนที่มีฟิลด์ ID, FirstMidName และ LastName นี่คือที่ที่คุณควรใช้แบบสอบถามการฉายภาพ ต่อไปนี้เป็นตัวอย่างง่ายๆของแบบสอบถามการฉายภาพ
using (var context = new UniContextEntities()) {
var studentList = from s in context.Students
orderby s.FirstMidName ascending
where s.FirstMidName == "Ali"
select new {s.ID, s.FirstMidName, s.LastName};
foreach (var student in studentList) {
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
}
Console.ReadKey();
}
แบบสอบถามการฉายภาพด้านบนไม่รวมฟิลด์ EnrollmentDate สิ่งนี้จะทำให้แอปพลิเคชันของคุณเร็วขึ้นมาก