對象表達式的Linq返回一個對象,該對象在枚舉時產生序列中的元素。通常,延遲的LINQ-to-Object方法充當流水線,因此序列中的每個元素都會在處理下一個元素之前流經處理管道。對Linq-to-Entities查詢操作的Linq-to-Objects查詢存在一些混淆
一個)但如果LINQ到對象查詢上的LINQ到實體查詢的結果進行操作,那麼當foreach
試圖遍歷search
,並再次各元件流過整個處理序列的下一個元素被處理之前(換句話說,是從DB檢索的序列中的第一個元素,然後由Enumerable.Where
處理,然後由Enumerable.SelectMany
處理,然後才從DB檢索下一個元素),或者是一次從DB檢索的整個元素集(當foreach
嘗試從序列中讀取第一個元素),只有這些元素開始流經Linq-to-Objects運算符的處理管道?
var search = context.Contacts.AsEnumerable().
Where(s => s.ContactID > 10).SelectMany(s => s.Address);
謝謝
1)因此,整個集合一次從DB中檢索,只有Enumerable操作符纔開始處理元素? 2)即使使用這個查詢,Enumerable運算符是否正確,只有當所有的Enumerable運算符完成處理前面的元素時,它纔會開始處理特定的元素? – carewithl
db查詢運行並在'AsEnumerable'之後,任何linq語句鏈被評估爲一個管道。但必須清楚的是,整個語句(包括db部分)只有在實際枚舉時纔會執行。 –
我可以問一下「作爲一條管線」是什麼意思嗎? – carewithl