IQueryable vs IEnumerable: IQueryable是否总是更好和更快?
IQueryable vs IEnumerable: IQueryable是否总是更好和更快?
IQueryable和IEnumerable代表两个不同的东西。将IQueryable视为一个“问题”,它本身没有任何结果。IEnumerable是一个“答案”,它只有与之相关的数据,但你无法知道生成这些数据的方式。
并不是说IQueryable“更快”,它只是允许你将过滤和投影放在你向SQL服务器提出的“问题”中,并让它只返回需要的答案(通过调用.ToList()或类似的方法返回一个IEnumerable)。如果只使用IEnumerable,你只能问“给我你所知道的一切”,然后在得到的答案上进行过滤和投影。这就是为什么IQueryable被认为更快,因为需要处理的数据要少得多,因为你能够向服务器提出更具体的问题。
IQueryable没有完全取代IEnumerable的原因是因为你要问一个问题的对象必须能够理解你提出的问题。要能够解析出你可能问它进行过滤或投影的每一个可能的事物需要很多工作,因此大多数实现都限制自己只能回答它们知道自己需要回答的常见问题。例如,在Entity Framework中,当你问一个它不理解如何处理的问题时,尝试从IQueryable获取一个IEnumerable(一个答案)时,你会得到一个类似于“指定的方法不受支持”的错误。
DBSet
DBSet