依據執行方式將標準查詢運算式分類
標準查詢運算子方法之 Objects 實作的 LINQ 會以兩種主要方法的其中一種執行:立即或延後。 使用延後執行的查詢運算子可另外細分成兩個分類:資料流和非資料流。如果您知道不同的查詢運算子如何執行,則有助於了解所收到查詢的結果。 這種情況在資料來源變更或您在某個查詢上建置另一個查詢時尤其如此。 本主題將根據執行方式分類標準查詢運算子。
執行方式
立即
立即執行表示會在程式碼中宣告查詢的位置讀取資料來源及執行作業。 所有傳回單一、不可列舉結果的標準查詢運算子都會立即執行。
延後
延後執行表示作業不會在程式碼中宣告查詢的位置執行。 作業只會在列舉查詢變數時執行,例如藉由使用 foreach (Visual Basic 中為 For Each) 陳述式。 這表示執行查詢的結果是根據查詢執行時,而不是定義查詢時的資料來源內容而定。 如果多次列舉查詢變數,則結果可能每次都不同。幾乎所有傳回型別為 IEnumerable<T> 或 IOrderedEnumerable<TElement> 的標準查詢運算子都會以延後的方式執行。
使用延後執行的查詢運算子可另外分類為資料流或非資料流。
資料流
資料流運算子在產生項目之前,不需要讀取所有來源資料。 執行時,資料流運算子會於讀取每個來源項目時執行其作業,並且產生項目 (如果適當的話)。 資料流運算子會繼續讀取來源項目,直到能夠產生結果項目為止。 這表示可能會讀取多個來源項目,以產生一個結果項目。
非資料流
非資料流運算子必須讀取所有來源資料,才能產生結果項目。 例如排序或分組這類作業都屬於這個分類。 執行時,非資料流查詢運算子會讀取所有來源資料,將資料輸入資料結構,執行作業並產生結果項目。
分類表
下表會根據執行方法分類每個標準查詢運算子方法。
注意事項 |
---|
如果某個運算子在兩個資料行中標記,則作業中包含兩個輸入序列,且每個序列會分別評估。 這些情況下,參數清單中的第一個序列會固定以延後的資料流方式評估。 |
標準查詢運算子 |
傳回型別 |
立即執行 |
延後資料流執行 |
延後非資料流執行 |
---|---|---|---|---|
TSource |
X |
|
|
|
X |
|
|
||
X |
|
|
||
|
X |
|
||
單一數值 |
X |
|
|
|
|
X |
|
||
|
X |
|
||
X |
|
|
||
X |
|
|
||
|
X |
|
||
|
X |
|
||
TSource |
X |
|
|
|
TSource |
X |
|
|
|
X |
|
|
||
|
X |
X |
||
TSource |
X |
|
|
|
TSource |
X |
|
|
|
|
|
X |
||
|
X |
X |
||
|
X |
X |
||
|
X |
X |
||
TSource |
X |
|
|
|
TSource |
X |
|
|
|
X |
|
|
||
單一數值、TSource 或 TResult |
X |
|
|
|
單一數值、TSource 或 TResult |
X |
|
|
|
|
X |
|
||
|
|
X |
||
|
|
X |
||
|
X |
|
||
|
X |
|
||
|
|
X |
||
|
X |
|
||
|
X |
|
||
X |
|
|
||
TSource |
X |
|
|
|
TSource |
X |
|
|
|
|
X |
|
||
|
X |
|
||
單一數值 |
X |
|
|
|
|
X |
|
||
|
X |
|
||
|
|
X |
||
|
|
X |
||
TSource 陣列 |
X |
|
|
|
X |
|
|
||
X |
|
|
||
X |
|
|
||
|
X |
|
||
|
X |
|