從過去人們將記錄拉入內存然後在.net而不是在數據庫級進行過濾的過去,我們在過去的團隊中遇到過性能問題。
只是作爲附錄科林的回答,並針對上面的報價,以避免這種情況的辦法是,以確保您的數據庫查詢與IQueryable<T>
第一個完全構建,通過調用枚舉結果之前如.ToList()
,或.ToArray()
。
作爲一個例子,考慮以下:
IEnumerable<Employee> employees = context.Employees;
// other code, before executing the following
var hrEmployees = employees.Where(o => o.Department == "HR").ToList();
的.ToList()
將枚舉結果斂從上下文員工首先,和然後執行在客戶端上的過濾。如果你有很多員工需要應對,這個表現不會很好,而且這個規模肯定不會很好。
相比之下,與此:
IQueryable<Employee> employees = context.Employees;
// other code, before executing the following
var hrEmployees = employees.Where(o => o.Department == "HR").ToList();
IQueryable<T>
從IEnumerable<T>
派生。它們之間的區別在於IQueryable<T>
內置了查詢提供程序,並且您構建的查詢被表示爲表達式樹。這意味着只有在枚舉查詢結果的調用(例如.ToList()
)之後纔會對其進行評估。
在上面的第二個示例中,查詢提供程序將執行SQL以僅提取屬於HR部門的員工,對數據庫本身執行過濾。