Linq(對象)方法可以是流式傳輸或非流式傳輸。有一個完整的概述here。
這大部分可以通過常識來理解。 A Select
可以將其數據流式傳輸到隨後的LINQ方法,因爲它可以「激發並忘記」單個項目。另一方面,在它可以做任何事情之前,顯然需要知道所有元素。所以Select
是流媒體,OrderBy
不是。同樣,Where
也是流媒體,因爲它同樣只需要處理一個元素。
您可以通過將跟蹤語句放入用作LINQ方法參數的代表來檢查此問題。我做了一個簡單的測試,用一些對象碰巧找到了某個地方。在Linqpad中:
Crops.Select (c => { ("s-" + c.CrpId).Dump(); return c.CrpId;})
.Where(i => { ("w1-" + i).Dump(); return i > 120; })
.Where(i => { ("w2-" + i).Dump(); return i > 150; })
.OrderBy (i => { ("o-" + i).Dump(); return i; })
正如你所看到的,lambda表達式被方法體取代,它基本上沒有任何區別。輸出是:
s-21
w1-21
s-93
w1-93
...
s-122
w1-122
w2-122
s-123
w1-123
w2-123
...
s-158
w1-158
w2-158
o-155
o-157
o-158
所以你看到Where
和Select
s的流,以及OrderBy
等待,直到所有的項目都可用。這也會導致第二個Select
(這裏有點人爲設計,確定)僅在必要時執行。
這取決於你使用LinqToObjects(使用'IEnumerable's)或LinqToEntites(使用'IQueryable's) –
我特別指LinqToObjects(使用IEnumerable) – prmph