共用方式為


LINQ to Entities

LINQ to Entities 提供 Language-Integrated 查詢 (LINQ) 支援,可讓開發人員使用 Visual Basic 或 Visual C# 針對 Entity Framework 概念模型撰寫查詢。 Entity Framework 的查詢是由針對對象內容執行的命令樹查詢來表示。 LINQ to Entities 會將 Language-Integrated 查詢 (LINQ) 查詢轉換成命令樹查詢、對 Entity Framework 執行查詢,並傳回 Entity Framework 和 LINQ 可以使用的物件。 以下是建立和執行 LINQ to Entities 查詢的程式:

  1. ObjectContext建構ObjectQuery<T>的實例。

  2. 使用 ObjectQuery<T> 實例,在 C# 或 Visual Basic 中撰寫 LINQ to Entities 查詢。

  3. 將 LINQ 標準查詢運算符和表示式轉換成命令樹狀結構。

  4. 針對數據源,在命令樹表示法中執行查詢。 在執行期間,數據源上擲回的任何例外狀況都會直接傳遞至用戶端。

  5. 將查詢結果傳回用戶端。

建構 ObjectQuery 實例

泛型類別 ObjectQuery<T> 代表一個查詢,此查詢傳回一個由零個或多個具型別的實體組成的集合。 對象查詢通常是從現有的對象內容建構,而不是手動建構,而且一律屬於該物件內容。 此內容提供撰寫和執行查詢所需的連接和元數據資訊。 泛 ObjectQuery<T> 型類別會實作 IQueryable<T> 泛型介面,其產生器方法可讓LINQ查詢以累加方式建置。 您也可以讓編譯程式使用 C# var 關鍵詞來推斷實體的類型(Dim 在 Visual Basic 中,已啟用本機類型推斷)。

撰寫查詢

泛型類別的 ObjectQuery<T> 實例會實作泛型 IQueryable<T> 介面,做為LINQ to Entities查詢的數據源。 在查詢中,您可以指定您想要從數據源擷取的資訊。 查詢也可以指定該資訊在傳回之前應該如何排序、分組和成形。 在 LINQ 中,查詢會儲存在變數中。 此查詢變數不會採取任何動作,而且不會傳回任何數據;它只會儲存查詢資訊。 建立查詢之後,您必須執行該查詢以擷取任何數據。

LINQ to Entities 查詢可以組成兩種不同的語法:查詢表達式語法和方法型查詢語法。 查詢表達式語法和方法型查詢語法是 C# 3.0 和 Visual Basic 9.0 中的新功能。

如需詳細資訊,請參閱 LINQ to Entities 中的查詢

查詢轉換

若要對 Entity Framework 執行 LINQ to Entities 查詢,LINQ 查詢必須轉換成可以針對 Entity Framework 執行的命令樹表示法。

LINQ to Entities 查詢是由 LINQ 標準查詢運算元(例如 SelectWhereGroupBy) 和表示式所組成(x > 10、Contact.LastName 等等)。 LINQ 運算子不是由類別定義,而是類別上的方法。 在 LINQ 中,表示式可以包含命名空間內的 System.Linq.Expressions 型別所允許的任何項目,同時,也可以包含任何可以用 Lambda 函式表示的項目。 這是一個超過 Entity Framework 所允許運算式的集合,按照定義僅限於資料庫上允許的操作,並受到 ObjectQuery<T> 的支援。

在 Entity Framework 中,運算符和表達式都會以單一類型階層來表示,然後放在命令樹中。 Entity Framework 會使用命令樹來執行查詢。 如果 LINQ 查詢無法以命令樹表示,則會在轉換查詢時擲回例外狀況。 LINQ to Entities 查詢的轉換牽涉到兩個子轉換:標準查詢運算子的轉換,以及表達式的轉換。

在 LINQ 標準查詢運算子中,有一些在 LINQ to Entities 中沒有有效翻譯的。 嘗試使用這些運算子會導致查詢轉譯時間發生例外狀況。 如需支援的 LINQ to Entities 運算符清單,請參閱支援和不支援的 LINQ 方法(LINQ to Entities)。

如需在 LINQ to 實體中使用標準查詢運算子的詳細資訊,請參閱 LINQ to Entities 查詢中的標準查詢運算符

一般而言,LINQ to Entities 中的表達式會在伺服器上進行評估,因此不應該預期表達式的行為會遵循 CLR 語意。 如需詳細資訊,請參閱 LINQ to Entities 查詢中的運算式

如需 CLR 方法呼叫如何對應至數據源中標準函式的資訊,請參閱 CLR 方法與標準函式對應

如需如何從 LINQ to Entities 查詢內呼叫標準函式、資料庫和自定義函式的相關信息,請參閱 在 LINQ to Entities 查詢中呼叫函式。

查詢執行

使用者建立 LINQ 查詢之後,它會轉換成與 Entity Framework 相容的表示法(以命令樹的形式),然後針對數據源執行。 在查詢運行時間,所有查詢表示式(或查詢的元件)都會在用戶端或伺服器上進行評估。 這包括用於結果具體化或實體投影的表達式。 如需詳細資訊,請參閱 查詢執行。 如需如何藉由編譯查詢一次,然後使用不同參數執行多次來改善效能的資訊,請參閱編譯的查詢(LINQ to Entities)。

物化

實現是將查詢結果以 CLR 型別傳回到客戶端的過程。 在 LINQ to Entities 中,查詢結果數據記錄永遠不會被直接傳回,總是會有一個後備的 CLR 類型,這個類型是由使用者或是 Entity Framework 定義,或是由編譯器產生(匿名類型)。 所有物件具體化都是由 Entity Framework 執行。 在 Entity Framework 與 CLR 之間因無法對應而產生的任何錯誤,都會在物件實體化期間擲回例外狀況。

查詢結果通常會以下列其中一項返回:

  • 零個或多個具型別實體物件的集合,或概念模型中定義之複雜類型的投影。

  • Entity Framework 支援的 CLR 類型。

  • 以內嵌方式呈現的集合。

  • 匿名類型。

如需詳細資訊,請參閱 查詢結果

本節中

LINQ 到實體的查詢

LINQ to Entities Framework 查詢中的表達式

在 LINQ to Entities 查詢中呼叫函式

編譯查詢(LINQ to Entities)

查詢執行

查詢結果

LINQ to Entities 查詢中的標準查詢運算子

CLR 方法到標準函數映射

支援和不支援的 LINQ 方法 (LINQ to Entities)

LINQ to Entities 的已知問題與注意事項

另請參閱