LINQ 查詢運算式 (C# 程式設計手冊)
Language-Integrated Query (LINQ) 是一組技術的名稱,這組技術所憑藉的基礎是將查詢功能直接整合至 C# 語言 (以及 Visual Basic,也可能是其他任何 .NET 語言) 中。透過 LINQ,查詢現在已成為第一級的語言建構,就如同類別、方法、事件等等。
對於撰寫查詢的開發人員而言,LINQ 最明顯的「語言整合」部分就是它的查詢運算式。查詢運算式是以 C# 3.0 所引入的宣告式「查詢語法」(Query Syntax) 來撰寫。透過使用查詢語法,您可以使用最少的程式碼,在資料來源上執行更為複雜的篩選、排序和群組等作業。您可以使用相同的基本查詢運算式模式,在 SQL 資料庫、ADO.NET 資料集、XML 文件和資料流以及 .NET 集合中查詢及轉換資料。
下列範例顯示完整的查詢作業。這套完整的作業包括建立資料來源、定義查詢運算式,以及在 foreach 陳述式中執行查詢。
class LINQQueryExpressions
{
static void Main()
{
// Specify the data source.
int[] scores = new int[] { 97, 92, 81, 60 };
// Define the query expression.
IEnumerable<int> scoreQuery =
from score in scores
where score > 80
select score;
// Execute the query.
foreach (int i in scoreQuery)
{
Console.Write(i + " ");
}
}
}
// Output: 97 92 81
如需 C# 中 LINQ 之基本概念的詳細資訊,請參閱 開始使用 C# 中的 LINQ。
查詢運算式概觀
查詢運算式可用來查詢及轉換 LINQ 所支援之資料來源中的資料。例如,單一查詢可以從 SQL 資料庫擷取資料,並產生 XML 資料流做為輸出。
查詢運算式非常容易學習,因為它使用了許多類似 C# 的語言建構。如需詳細資訊,請參閱 開始使用 C# 中的 LINQ。
查詢運算式中的變數全都是強式型別變數,不過在許多情況下您並不需要明確提供型別,因為編譯器可以推斷其型別。如需詳細資訊,請參閱LINQ 查詢作業中的型別關聯性 (C#)。
在您使用 foreach 迴圈逐一查看迴圈中的查詢變數之前,查詢都不會執行。如需詳細資訊,請參閱LINQ 查詢簡介 (C#)。
在編譯時期,查詢運算式會依據 C# 規格中所訂立的規則,轉換成「標準查詢運算子」方法呼叫。可以使用查詢語法表示的任何查詢也都可以使用方法語法來表示。不過,在大部分的情況下,查詢語法的可讀性較高,也較為精簡。如需詳細資訊,請參閱 C# 語言規格和標準查詢運算子概觀。
撰寫 LINQ 查詢時,我們建議您盡可能使用查詢語法,必要時才使用方法語法。這兩種不同的形式在語意或效能上並沒有任何差異。查詢運算式的可讀性通常高於以方法語法撰寫的對等運算式。
某些查詢作業 (例如 Count 或 Max) 並沒有對等的查詢運算式子句,因此必須以方法呼叫來表示。方法語法可以透過各種方式與查詢語法合併使用。如需詳細資訊,請參閱LINQ 中的查詢語法及方法語法 (C#)。
根據查詢所套用的型別而定,查詢運算式可以編譯成運算式樹狀架構或委派。IEnumerable<T> 查詢會編譯成委派。IQueryable 和 IQueryable<T> 查詢則會編譯成運算式樹狀架構。如需詳細資訊,請參閱 運算式樹狀架構 (C# 和 Visual Basic)。
下表列出的主題提供了有關查詢的其他資訊以及一般工作的程式碼範例。
主題 |
描述 |
---|---|
簡介基本查詢概念,並提供 C# 查詢語法的範例。 |
|
提供幾種基本查詢運算式類型的範例。 |
|
將可能擲回例外狀況的程式碼移出查詢運算式的方式和時機。 |
|
如何使用 select 陳述式將不同來源的資料合併成新的型別。 |
|
示範使用 group 子句的各種不同方式。 |
|
示範如何建立巢狀群組。 |
|
示範如何使用查詢中的子運算式做為新查詢的資料來源。 |
|
說明如何實作安全執行緒 (Thread-Safe) 標準查詢運算子,這個運算子可以在資料流 (Streaming) 資料來源上執行群組作業。 |
|
示範如何提供任意數目的值,以用於 where 子句中的相等比較。 |
|
說明如何在不使用 foreach 迴圈的情況下,應用並儲存查詢結果。 |
|
示範如何從方法傳回查詢變數,以及如何將這些變數傳遞至方法做為輸入參數。 |
|
示範如何依據任何一種述詞函式來執行聯結作業。 |
|
示範如何依據多個相符索引鍵來聯結兩個來源。 |
|
示範如何排序聯結作業所產生的序列。 |
|
示範如何在 LINQ 中執行內部聯結 (Inner Join)。 |
|
示範如何在 LINQ 中產生群組聯結。 |
|
示範如何在 LINQ 中產生左外部聯結 (Left Outer Join)。 |
|
示範如何處理 LINQ 查詢中的 null 值。 |