如果
IQueryable
接口執行服務器查詢表達式,而不是像獲取所有IEnumerable
記錄,爲什麼IQueryable
不IEnumerable
替代它可以更快,更高效?IQueryable與IEnumerable:IQueryable總是更好更快?DBSet<T>
有兩種口味Where
(IQueryable
和IEnumerable
)。有沒有辦法調用IEnumerable
版本,因爲默認情況下會調用IQueryable
,而不會調用ToList()
?
回答
- 如果
IQueryable
在服務器上而不是 獲取像IEnumerable
所有記錄進行查詢表達式,爲什麼不IQueryable
取代 通過IEnumerable
它可以更快,更高效?
IQueryable
和IEnumerable
代表兩個不同的事情。把IQueryable
想象成一個「問題」,它本身沒有任何結果。一個IEnumerable
是一個「答案」,它只有數據連接到它,但你不知道生成的數據是什麼。
這並不是說IQueryable
每個說法都「更快」,它只是允許你將你的過濾和預測放到你問SQL服務器的「問題」中,讓它只返回它需要的答案(以IEnumerable
的形式通過調用.ToList()
或類似的形式)。
如果您只使用IEnumerable
,那麼您可以問的唯一問題是「給我所有你知道的東西」,然後根據它給你的答案進行過濾和投影。這就是爲什麼IQueryable
被認爲更快,因爲有更少的數據需要處理,因爲你可以向服務器提出更具體的問題。
原因IQueryable
並沒有取代IEnumerable
無處不在是因爲你問的問題必須能夠理解你問的問題。需要很多工作才能解析每個可能的事情,您可以通過它來過濾或投影大多數實現limit themselves to only common things they know they need to be able to answer。例如,在實體框架中,如果您提出的問題不明白如何處理,則會出現類似於的錯誤「指定的方法不受支持」當您嘗試從IQueryable
獲得IEnumerable
(答案)時。
DBSet<T>
具有Where
(IQueryable
和IEnumerable
)兩種口味。 有沒有辦法調用IEnumerable
版本,因爲默認情況下調用了IQueryable
,而不調用ToList()
?
類DBSet<T>
沒有Where method on it at all。兩個Where
函數來自兩個擴展方法,Enumerable.Where
和Queryable.Where
。在調用擴展方法之前,可以強制它使用Enumerable超載,方法是將對象強制轉換爲IEnumerable<T>
。不過請記住,Queryable.Where
過濾問題,Enumerable.Where
只過濾結果。
從服務器請求結果然後把它們扔掉是浪費的,所以我不會推薦這樣做。
- 1. 是否stream.max()總是比stream.reduce()更快?
- 2. 是XmlFormat()總是比htmlEditFormat()更好?
- 3. PHP CURL api是否比HTTP/HTTPS訪問使用流更快/更好/更好?
- 4. 使用asp Control總是更好嗎?
- 5. 這是更好還是更快的方法?
- 6. C#Interop與C vs Interop與Java:哪個更好/更容易/更快?
- 7. OkHttp更快或更好,HttpUrlsConnection爲Android?
- 8. 哪個mysql選擇更好/更快?
- 9. NSPredicate與NSString:尋找超弦的哪個更好/更快?
- 10. 更快/更好:取一些與PHP或JavaScript
- 11. 更好/更快的方式? java文本冒險與stax
- 12. 哪一個是更快/更好的sql練習?
- 13. 速度更快/使用更好:MySQL還是PHP md5函數?
- 14. 在django中,是否聚合(Count())比.count()更快或更好?
- 15. 更快RSpec與JRuby
- 16. ImageMagick與GD - 哪個速度更快,資源更少,產生更好的圖像?
- 17. 「更好」(更簡單,更快,無論)版本'不同的委託'?
- 18. 哪個更快/更好:哪裏更新或合併?
- 19. 是否使用API總是比刮取更好?
- 20. 插入與ORDER BY更快
- 21. ASP.NET與.NET 4更快
- 22. linq2sql表達式總是返回IQueryable嗎?
- 23. Linq更快,更慢還是相同?
- 24. 更換總是更換空值
- 25. 全局分區索引是否比非分區索引更好(更快)?
- 26. 更好的URL與mod_rewrite?
- 27. mosso與gogrid哪個更好?
- 28. 出於好奇:哪個更適合創建總和?總和(列表)與積累
- 29. 誰更快:PEG還是GLR?
- 30. 是'絕對'比Move()更快?
你的例子(問題和答案)很好,正如我從它理解的那樣,'IQueryable'沒有用,直到我將它轉換爲IEnumerable列表才能得到理想的答案 –