最近在調研資料庫查詢時因使用IEnumerable進行Linq to entity的操作,造成資料庫通路緩慢。此文講述的便是IEnumerable和IQueryable的差別。
微軟對IEnumerable的定義使用場景為Linq to Object,也就是涉及到記憶體操作時使用。而對IQueryable的定義使用場景為Linq to SQL(Entity)。
是以,在執行Linq to SQL(Entity)的操作時,如果使用IEnumerable則會造成全表查詢。如下圖Code:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcukDOlZzM4QjMhhzNhlTMjdTO4Q2MkBTNjhDOhF2NhVWNfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
如此,在SQL Profile監測到的執行語句為兩次全表查詢。
然而,當我們正确使用IQueryable或者var時,如下圖Code:
得到的查詢語句為:
為了一探IEnumerabel和IQueryable在實際工作中的程式執行效率,總結來下圖的時間對比:
在這張圖上看到的時間機關雖然為毫秒,但這是代碼同步執行語句的查詢時間,但多個用戶端同時通路資料庫時,此時造成的資料通路速度就不再是毫秒了。
墨匠