Asp.net-Mvc-3

為什麼將 Count 與 IQueryable 一起使用被認為是不可行的

  • November 13, 2017

如果我有以下程式碼:-

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 到對象。

引用自:https://stackoverflow.com/questions/9245933