共用方式為


語言整合式查詢 (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。 複雜的提供者比較普遍,因為它可以處理查詢中更廣泛的問題。 它也具有開放式類型系統,因此必須包含廣泛的基礎結構,才能對應使用者定義型別。 開發複雜的供應商需要大量的努力。