从过去人们将记录拉入内存然后在.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部门的员工,对数据库本身执行过滤。