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 สิ่งนี้จะทำให้แอปพลิเคชันของคุณเร็วขึ้นมาก