標準查詢運算子概觀
「標準查詢運算子」(Standard Query Operator) 是形成 Language-Integrated Query (LINQ) 模式的方法。 這些方法大部分都可用於序列,而這裡的序列是指其型別會實作 IEnumerable 介面或 IQueryable 介面的物件。 標準查詢運算子提供的查詢功能包括篩選、投影、彙總 (Aggregation)、排序等等。
LINQ 標準查詢運算子共有兩組,其中一組適用於型別 IEnumerable 的物件,而另一組則適用於型別 IQueryable 的物件。 構成各組的方法分別隷屬於 Enumerable 和 Queryable 類別的靜態 (Static) 成員。 這些方法會定義為其適用型別的「擴充方法」(Extension Method)。 這表示您可以使用靜態方法語法或執行個體方法 (Instance Method) 語法來呼叫這些方法。
此外,還有幾個標準查詢運算子方法適用於不是以 IEnumerable 或 IQueryable 做為依據的其他型別。 Enumerable 型別定義兩個這類方法,而這兩個方法都適用於型別 IEnumerable 的物件。 這些方法 (Cast``1(IEnumerable) 和 OfType``1(IEnumerable)) 可以讓您啟用以 LINQ 模式查詢非參數型或非泛型集合的功能。 採用的方法是建立物件的強型別集合。 Queryable class 定義兩個類似的方法,即 Cast``1(IQueryable) 和 OfType``1(IQueryable),適用於型別 Queryable 的物件。
標準查詢運算子的執行時機並不相同,實際情況需視其傳回的是單一值或值序列而定。 傳回單一值的方法 (例如 Average 和 Sum) 會立即執行; 而傳回序列的方法則會延後執行查詢,並傳回可列舉的物件。
若以適用於記憶體中集合的方法 (亦即擴充 IEnumerable 的方法) 為例,傳回的可列舉物件會擷取傳遞至方法的引數。 在列舉該物件時,將會採用查詢運算式的邏輯並傳回查詢結果。
相反地,擴充 IQueryable 的方法不會實作任何查詢行為,而會建置 (Build) 表示要執行之查詢的運算式樹狀架構。 查詢的工作是由來源 IQueryable 物件負責處理。
查詢方法的呼叫可以共同鏈結成一項查詢,讓查詢變得相當複雜。
下列程式碼範例示範如何使用標準查詢運算子取得序列的相關資訊。
Dim sentence = "the quick brown fox jumps over the lazy dog"
' Split the string into individual words to create a collection.
Dim words = sentence.Split(" "c)
Dim query = From word In words
Group word.ToUpper() By word.Length Into gr = Group
Order By Length _
Select Length, GroupedWords = gr
Dim output As New System.Text.StringBuilder
For Each obj In query
output.AppendLine(String.Format("Words of length {0}:", obj.Length))
For Each word As String In obj.GroupedWords
output.AppendLine(word)
Next
Next
'Display the output
MsgBox(output.ToString())
' This code example produces the following output:
'
' Words of length 3:
' THE
' FOX
' THE
' DOG
' Words of length 4:
' OVER
' LAZY
' Words of length 5:
' QUICK
' BROWN
' JUMPS
string sentence = "the quick brown fox jumps over the lazy dog";
// Split the string into individual words to create a collection.
string[] words = sentence.Split(' ');
// Using query expression syntax.
var query = from word in words
group word.ToUpper() by word.Length into gr
orderby gr.Key
select new { Length = gr.Key, Words = gr };
// Using method-based query syntax.
var query2 = words.
GroupBy(w => w.Length, w => w.ToUpper()).
Select(g => new { Length = g.Key, Words = g }).
OrderBy(o => o.Length);
foreach (var obj in query)
{
Console.WriteLine("Words of length {0}:", obj.Length);
foreach (string word in obj.Words)
Console.WriteLine(word);
}
// This code example produces the following output:
//
// Words of length 3:
// THE
// FOX
// THE
// DOG
// Words of length 4:
// OVER
// LAZY
// Words of length 5:
// QUICK
// BROWN
// JUMPS
查詢運算式語法
某些較常用的標準查詢運算子具有專屬的 C# 和 Visual Basic 語言關鍵字語法,使系統可以在「查詢運算式」(Query Expression) 中一併呼叫這些運算子。 如需具有專屬關鍵字之標準查詢運算子及其對應語法的詳細資訊,請參閱標準查詢運算子的查詢運算式語法。
擴充標準查詢運算子
您可以透過建立適用於目標網域或技術的網域特定方法,擴充標準查詢運算子的集合。 您也可以將標準查詢運算子取代成自己的實作,以提供額外的服務,例如遠端評估、查詢轉譯以及最佳化。 如需範例,請參閱 AsEnumerable``1。
相關章節
您可以利用下列連結,檢視依據功能提供各種標準查詢運算子相關詳細資訊的說明主題。