標準查詢運算子概觀
更新:2007 年 11 月
「標準查詢運算子」(Standard Query Operator) 是形成 Language-Integrated Query (LINQ) 模式的方法。這些方法大部分都可用於序列,而這裡的序列是指其型別會實作 IEnumerable<T> 介面或 IQueryable<T> 介面的物件。標準查詢運算子提供的查詢功能包括篩選、投影、彙總 (Aggregation)、排序等等。
LINQ 標準查詢運算子共有兩組,其中一組適用於型別 IEnumerable<T> 的物件,而另一組則適用於型別 IQueryable<T> 的物件。構成各組的方法分別隷屬於 Enumerable 和 Queryable 類別的靜態 (Stastic) 成員。這些方法會定義為其適用型別的「擴充方法」(Extension Method)。這表示您可以使用靜態方法語法或執行個體方法 (Instance Method) 語法來呼叫這些方法。
此外,還有幾個標準查詢運算子方法適用於不是以 IEnumerable<T> 或 IQueryable<T> 做為依據的其他型別。Enumerable 型別定義兩個這類方法,而這兩個方法都適用於型別 IEnumerable 的物件。這些方法 (Cast<TResult>(IEnumerable) 和 OfType<TResult>(IEnumerable)) 可以讓您啟用以 LINQ 模式查詢非參數型或非泛型集合的功能。採用的方法是建立物件的強型別集合。Queryable class 定義兩個類似的方法,即 Cast<TResult>(IQueryable) 和 OfType<TResult>(IQueryable),適用於型別 Queryable 的物件。
標準查詢運算子的執行時機並不相同,實際情況需視其傳回的是單一值或值序列而定。傳回單一值的方法 (例如 Average 和 Sum) 會立即執行;而傳回序列的方法則會延後執行查詢,並傳回可列舉的物件。
若以適用於記憶體中集合的方法 (亦即擴充 IEnumerable<T> 的方法) 為例,傳回的可列舉物件會擷取傳遞至方法的引數。在列舉該物件時,將會採用查詢運算式的邏輯並傳回查詢結果。
相反地,擴充 IQueryable<T> 的方法不會實作任何查詢行為,而會建置 (Build) 表示要執行之查詢的運算式樹狀架構。查詢的工作是由來源 IQueryable<T> 物件負責處理。
查詢方法的呼叫可以共同鏈結成一項查詢,讓查詢變得相當複雜。
下列程式碼範例示範如何使用標準查詢運算子取得序列的相關資訊。
Dim sentence As String = "the quick brown fox jumps over the lazy dog"
' Split the string into individual words to create a collection.
Dim words As String() = 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<TSource>。
相關章節
您可以利用下列連結,檢視依據功能提供各種標準查詢運算子相關詳細資訊的說明主題。