實體框架 - 投影查詢



LINQ to Entities

理解 LINQ to Entities 最重要的概念之一是它是一種宣告式語言。重點在於定義您需要什麼資訊,而不是如何獲取資訊。

  • 這意味著您可以將更多時間用於處理資料,而減少花費在嘗試找出執行諸如訪問資料庫等任務所需的底層程式碼上的時間。

  • 重要的是要理解,宣告式語言實際上並沒有從開發人員那裡消除任何控制權,但它有助於開發人員將注意力集中在重要的事情上。

LINQ to Entities 核心關鍵字

瞭解用於建立 LINQ 查詢的基本關鍵字非常重要。只需要記住幾個關鍵字,但您可以以各種方式組合它們以獲得特定的結果。以下列表包含這些基本關鍵字,並提供每個關鍵字的簡單描述。

序號 關鍵字及描述
1

升序

指定排序操作從範圍的最小(或最低)元素到範圍的最高元素進行。這通常是預設設定。例如,在執行字母排序時,排序範圍將從 A 到 Z。

2

指定用於實現分組的欄位或表示式。欄位或表示式定義用於執行分組任務的鍵。

3

降序

指定排序操作從範圍的最大(或最高)元素到範圍的最低元素進行。例如,在執行字母排序時,排序範圍將從 Z 到 A。

4

等於

用於聯接語句的左右子句之間,以將主要上下文資料來源聯接到輔助上下文資料來源。equals 關鍵字左側的欄位或表示式指定主資料來源,而 equals 關鍵字右側的欄位或表示式指定輔助資料來源。

5

指定用於獲取所需資訊的資料來源並定義範圍變數。此變數與迴圈中用於迭代的變數具有相同的用途。

6

使用您指定的鍵值將輸出組織成組。使用多個 group 子句建立多級輸出組織。group 子句的順序決定了特定鍵值在分組順序中出現的深度。您可以將此關鍵字與 by 結合使用以建立特定的上下文。

7

以多種方式使用。在這種情況下,關鍵字確定查詢使用的上下文資料庫源。在使用聯接時,in 關鍵字用於聯接使用的每個上下文資料庫源。

8

指定一個識別符號,您可以將其用作 LINQ 查詢子句(如聯接、組和選擇)的參考。

9

聯接

從兩個相關資料來源(例如在主/詳細資訊設定中)建立一個單一資料來源。聯接可以指定內部聯接、組聯接或左外部聯接,其中內部聯接為預設值。您可以在msdn.microsoft.com上閱讀有關聯接的更多資訊

10

定義一個範圍變數,您可以使用它在查詢表示式中儲存子表示式結果。通常,範圍變數用於提供額外的列舉輸出或提高查詢效率(以便僅需執行一次特定任務,例如查詢字串的小寫值)。

11

指定用於實現聯接的欄位或表示式。欄位或表示式定義一個對兩個上下文資料來源都通用的元素。

12

排序依據

為查詢建立排序順序。您可以新增 ascending 或 descending 關鍵字來控制排序順序。使用多個 orderby 子句建立多級排序。orderby 子句的順序決定了處理排序表示式的順序,因此使用不同的順序會導致不同的輸出。

13

哪裡

定義 LINQ 應從資料來源中檢索什麼。您可以使用一個或多個布林表示式來定義要檢索內容的細節。布林表示式使用 &&(AND)和 ||(OR)運算子彼此分隔。

14

選擇

透過指定要返回的資訊來確定 LINQ 查詢的輸出。此語句定義 LINQ 在迭代過程中返回的元素的資料型別。

投影

投影查詢透過僅從資料庫檢索特定欄位來提高應用程式的效率。

  • 獲得資料後,您可能希望根據需要對其進行投影或篩選,以在輸出之前塑造資料。

  • 任何 LINQ to Entities 表示式的主要任務都是獲取資料並將其作為輸出提供。

本章的“開發 LINQ to Entities 查詢”部分演示了執行此基本任務的技術。

讓我們看一下以下程式碼,其中將檢索學生列表。

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() 返回預設值 null,如果為提供的條件沒有結果資料。

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();
}

標準與投影實體框架查詢

假設您有一個包含 ID、FirstMidName、LastName 和 EnrollmentDate 的 Student 模型。如果您想返回學生列表,則標準查詢將返回所有欄位。但是,如果您只想獲取包含 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 欄位。這將使您的應用程式更快。

廣告