標準查詢運算符方法的LINQ to Objects實作會以兩種主要方式之一執行:立即或延遲。 使用延遲執行的查詢運算符可以另外分成兩個類別:串流和非串流。 如果您知道不同查詢運算符的執行方式,它可能有助於瞭解您從指定查詢取得的結果。 如果數據源正在變更,或者您要在另一個查詢之上建置查詢,這尤其如此。 本主題會根據其執行方式來分類標準查詢運算符。
執行方式
立即
立即執行表示會讀取數據源,而且作業會在宣告查詢的程式代碼中執行。 所有傳回單一不可列舉結果的標準查詢運算子都會立即執行。
已延遲
延遲執行表示作業不會在宣告查詢的程式代碼中執行。 只有在列舉查詢變數時,才會執行此作業,例如使用 For Each 語句。 這表示執行查詢的結果取決於執行查詢時數據源的內容,而不是定義查詢時。 如果多次列舉查詢變數,則每次結果可能會有所不同。 幾乎所有傳回型別為 IEnumerable<T> 或 IOrderedEnumerable<TElement> 的標準查詢運算符都是以延遲方式執行的。
使用延後執行的查詢運算符可以另外分類為串流或非串流。
串流
串流運算子在產生元素之前不需要讀取所有源數據。 在執行時,串流運算符會在讀取時在每個來源元素上執行其作業,並在適當時產生元素。 串流運算符會繼續讀取來源元素,直到產生結果項目為止。 這表示可能會讀取多個來源元素來產生一個結果元素。
非串流
非串流運算子必須先讀取所有源資料,才能產生結果元素。 排序或群組之類的作業屬於此類別。 在執行時,非串流查詢運算符會讀取所有源數據、將其放入數據結構、執行作業,併產生產生的元素。
分類數據表
下表根據其執行方法,將每個標準查詢運算符方法分類。
備註
如果運算符在兩個數據行中標示,則作業會涉及兩個輸入序列,而且每個序列會以不同的方式進行評估。 在這些情況下,它一律是參數清單中的第一個序列,會以延遲的串流方式進行評估。