會使用兩種主要方式之一執行標準查詢運算子方法的 LINQ to Objects 實作:立即或延後。 使用延後執行的查詢運算子可以另外細分成兩個分類︰資料流和非資料流。 如果您知道如何執行不同的查詢運算子,則可以協助您了解透過給定查詢所取得的結果。 如果資料來源變更,或您所建置的查詢是根據另一個查詢,則這特別有用。 本主題會根據執行方式來分類標準查詢運算子。
執行方式
立即
立即執行表示讀取資料來源,並且在程式碼中宣告查詢的位置執行作業。 會立即執行傳回單一非可列舉結果的所有標準查詢運算子。
已延遲
延後執行表示未在程式碼中宣告查詢的位置執行作業。 只有在列舉查詢變數時,才會執行這項作業,例如,透過使用 For Each
陳述式。 這表示執行查詢的結果取決於執行查詢時的資料來源內容,而不是定義查詢時的資料來源內容。 如果多次列舉查詢變數,則每次都可能會有不同的結果。 幾乎傳回型別為 IEnumerable<T> 或 IOrderedEnumerable<TElement> 的所有標準查詢運算子都會以延遲方式執行。
使用延後執行的查詢運算子可以另外分類為資料流和非資料流。
串流
資料流運算子在產生項目之前不需要讀取所有來源資料。 執行時,資料流運算子會在讀取並產生項目時 (適用時) 於每個來源項目上執行其運算。 除非產生結果項目,否則資料流運算子會繼續讀取來源項目。 這表示可能會讀取多個來源項目,以產生一個結果項目。
非資料流
非資料流運算子在產生結果項目之前必須讀取所有來源資料。 排序或分組這類作業會歸到此分類。 執行時,非資料流查詢運算子會讀取所有來源資料、將其放入資料結構中、執行作業,並產生結果項目。
分類表
下表會根據執行方法來分類每個標準查詢運算子方法。
注意
如果在兩個資料行中標記運算子,則作業包含兩個輸入序列,而且會以不同的方式評估每個序列。 在這些情況下,它一律是參數清單中以延後資料流方式評估的第一個序列。