繁体   English   中英

IQueryable vs IEnumerable:IQueryable总是更好更快吗?

[英]IQueryable vs IEnumerable: is IQueryable always better and faster?

  1. 如果IQueryable接口在服务器中执行查询表达式而不是获取IEnumerable类的所有记录,为什么IQueryable不会被IEnumerable替换,它可以更快更高效?

  2. DBSet<T>有两种WhereIQueryableIEnumerable )。 有没有办法调用IEnumerable版本,因为默认情况下调用IQueryable而不调用ToList()

  1. 如果IQueryable在服务器中执行查询表达式而不是像IEnumerable那样获取所有记录,那么为什么IQueryable不会被IEnumerable替换,它可以更快更高效?

IQueryableIEnumerable代表两种不同的东西。 IQueryable视为一个“问题”,它本身没有任何结果。 IEnumerable是一个“答案”,它只有连接到它的数据,但你不知道是什么产生了这些数据。

并不是说IQueryable是“更快”的说法,它只是允许你将过滤和投影放到你向SQL服务器询问的“问题”中,让它只返回它需要的答案(以形式通过调用.ToList()或类似的IEnumerable )。

如果您只使用IEnumerable ,您可以问的唯一问题是“给我你知道的一切”,然后在答案上给你执行过滤和预测。 这就是为什么IQueryable被认为更快的原因,因为需要处理的数据要少得多,因为你可以向服务器提出更具体的问题。

IQueryable没有在任何地方取代IEnumerable的原因是因为您提出问题的事情必须能够理解您提出的问题。 能够解析您可能要求它过滤或投影的每个可能的事情需要做很多工作,因此大多数实现仅限于他们知道他们需要能够回答的常见事物 例如,在实体框架中,当您提出一个不理解如何处理的问题时,当您尝试从IQueryable获取IEnumerable (答案)时,将会收到类似于“不支持指定方法”的错误。

  1. DBSet<T>有两种WhereIQueryableIEnumerable )。 有没有办法调用IEnumerable版本,因为默认情况下调用IQueryable ,而不调用ToList()

DBSet<T>根本没有Where方法 两个Where函数来自两个扩展方法, Enumerable.WhereQueryable.Where 在调用扩展方法之前,可以通过将对象强制转换为IEnumerable<T>来强制它使用Enumerable重载。 但请记住, Queryable.Where过滤问题, Enumerable.Where只过滤结果。

从服务器请求结果然后将它们扔掉是浪费的,所以我不建议这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM