Andy , 2023/05/11
兩者都是用來執行LINQ的Interface,主要的差別在於查詢的方式與執行的時機。
先定義一個DbContext,以便後續說明,並假設Book資料表中有10筆資料。
從資料庫中撈取資料,存至記憶體中,並在記憶體中篩選。
在IDE中寫好的IQueryable只是"查詢狀態",此時還沒執行資料庫的查詢,因此不會有資料載入記憶體的行為。若指派某些會得到"明確結果"的function,如Count()、ToList()等,此時才會執行SQL查詢指令,取得查詢結果。
以下程式定義的變數都會得到IQueryable物件,實際上不會去執行SQL查詢,而是將查詢轉換成Expresion,並將所有查詢條件存於Provider中。
以下程式會真的執行SQL查詢,IQueryable介面會將Expression傳遞給Provider,由Provider轉譯成T-SQL後,從DB中取得資料,得到"明確結果"
如果在宣告變數時不指定資料型態,會預設指定IQueryable物件。
了解原理之後,才能避免浪費效能的寫法。
由於IEnymerable與IQueryable都有延遲載入的機制,因此使用之前應該先將查詢結果保存,以避免重新查詢。
以下程式是不良示範,每跑一次迴圈都會訪問一次資料庫,如果查詢結果資料量大,就會造成效能降低的負面影響。
存成List就可以避免這個問題。
back-end