Asp.net-Mvc-3
為什麼將 Count 與 IQueryable 一起使用被認為是不可行的
如果我有以下程式碼:-
IQueryable<People> list = repository.FindAllPeople; int count = list.Count();那麼是否認為統計 IQueryable 對像是不可行的,使用 IEnumerable 比較好呢?BR
你被誤導了。
IEnumerable將使用 Linq 到對象,所有方法都在記憶體中的對像上執行。-IQueryable將使用特定提供者提供的 Linq 擴展方法的任何實現。在這種情況下(儲存庫),我猜它很可能是一個將 Linq 表達式映射到數據庫語句的提供程序。這意味著如果您使用
IQueryable:IQueryable<People> list = repository.FindAllPeople; int count = list.Count();計數由數據庫本身確定,即作為查詢
"select count(*) from People"。這通常非常非常快。如果您使用
IEnumerable:IEnumerable<People> list = repository.FindAllPeople; int count = list.Count();當 Linq to objects 遍歷集合以確定計數時,所有 People 實例將被一一物化到記憶體中。這將非常緩慢,應盡可能避免。
由於並非所有方法呼叫都可以映射到數據庫查詢,因此有時使用 是不可避免的
IEnumerable,但如果可能,所有過濾、連接和分組都應在 IQueryable 上完成,然後作為最後一步,您可以使用AsEnumerable()擴展方法切換到使用IEnumerable和 Linq 到對象。