共用方式為


語言整合式查詢 (LINQ)

Language-Integrated Query (LINQ) 是以將查詢功能直接整合到 C# 語言為基礎的一組技術名稱。 傳統上,對數據的查詢會以簡單字串表示,而不需要在編譯時期進行類型檢查或 IntelliSense 支援。 此外,您必須瞭解每種數據來源類型的不同查詢語言:SQL 資料庫、XML 檔、各種 Web 服務等等。 使用 LINQ 時,查詢是一流的語言建構,就像類別、方法和事件一樣。

當您撰寫查詢時,LINQ 最明顯的「語言整合」部分就是查詢表達式。 你用宣告式 查詢語法來寫查詢表達式。 藉由使用查詢語法,您可以使用最少的程式代碼,對數據源執行篩選、排序和分組作業。 您可以使用相同的查詢表示式模式,從任何類型的數據源查詢和轉換數據。

下列範例顯示完整的查詢作業。 完整的作業包括建立數據源、定義查詢表達式,以及在語句中 foreach 執行查詢。

// Specify the data source.
int[] scores = [97, 92, 81, 60];

// Define the query expression.
IEnumerable<int> scoreQuery =
    from score in scores
    where score > 80
    select score;

// Execute the query.
foreach (var i in scoreQuery)
{
    Console.Write(i + " ");
}

// Output: 97 92 81

您可能需要為上述範例新增 using 指示詞 using System.Linq;,才能進行編譯。 最新版本的 .NET 會使用 隱含的 using ,將這個指示詞新增為 全域使用。 舊版要求您在來源中新增它。

查詢表達式概觀

  • 查詢表達式會檢視並轉換任何支援 LINQ 的資料來源。 例如,單一查詢即可從 SQL 資料庫取得資料並產生 XML 串流作為輸出。
  • 查詢表達式使用許多熟悉的 C# 語言建構,讓它們更容易閱讀。
  • 查詢表達式中的變數全都是強型別。
  • 在您迭代查詢變數之前,不會執行查詢,例如在 foreach 語句中。
  • 編譯時,編譯器會依照 C# 規範中定義的規則,將查詢表達式轉換為標準查詢運算子方法呼叫。 你可以用方法語法來表達任何使用查詢語法的查詢。 在某些情況下,查詢語法更容易閱讀且簡潔。 在其他情況下,方法語法更容易閱讀。 這兩種不同形式之間沒有語意或效能差異。 如需詳細資訊,請參閱 C# 語言規格標準查詢運算符概觀
  • 有些查詢操作,如 CountMax,沒有等價的查詢表達子句,必須以方法呼叫方式表達。 你可以用各種方式結合方法語法和查詢語法。
  • 查詢表達式可以編譯成表示式樹或委派,視查詢套用的類型而定。 編譯器會編 IEnumerable<T> 譯查詢給代理。 編譯器將 IQueryableIQueryable<T> 編譯成查詢的表達式樹。 如需詳細資訊,請參閱 表達式樹狀架構

如何啟用數據源的LINQ查詢

記憶體內部數據

你可以用兩種方式啟用 LINQ 查詢記憶體資料。 如果資料的類型有實作IEnumerable<T>,請使用 LINQ to Objects 查詢資料。 如果透過實作介面 IEnumerable<T> 無法使列舉合理化,請在該類型中定義 LINQ 標準查詢運算子方法,或作為該類型的擴充成員。 標準查詢運算符的自定義實作應該使用延後執行來傳回結果。

遠端資料

啟用遠端資料源 LINQ 查詢的最佳選項是實作 IQueryable<T> 介面。

IQueryable LINQ 提供者

IQueryable<T> 作的LINQ提供者在複雜度上可能會有很大的差異。

較不複雜的 IQueryable 提供者可能會從 Web 服務存取單一方法。 這種類型的提供者是數據源特有的,因為它需要它所處理之查詢中的特定資訊。 它有一個封閉式類型系統,或許會公開單一結果類型。 大部分的查詢執行都會在本機發生,例如使用 Enumerable 標準查詢運算符的實作。 較簡單的提供者可能只檢查代表查詢的表達式樹中的一個方法呼叫表達式,並將查詢的其他邏輯交由其他地方處理。

IQueryable中度複雜度提供者可能會以具有部分表達查詢語言的數據源為目標。 如果以 Web 服務為目標,它可能會存取一個以上的 Web 服務方法,並根據查詢所搜尋的資訊選取要呼叫的方法。 中等複雜度的提供者擁有比簡單提供者更豐富的型別系統,但它仍然是固定型別系統。 例如,提供者可能會公開具有一對多關係且可遍歷的類型,但不會提供使用者定義型態的映射技術。

複雜 IQueryable 提供者,例如 Entity Framework Core 提供者,可能會將完整的 LINQ 查詢轉譯成表達查詢語言,例如 SQL。 複雜的提供者比較普遍,因為它可以處理查詢中更廣泛的問題。 它也具有開放式類型系統,因此必須包含廣泛的基礎結構,才能對應使用者定義型別。 開發複雜的供應商需要大量的努力。