【问题标题】:IQueryable vs IEnumerable: is IQueryable always better and faster?IQueryable 与 IEnumerable:IQueryable 总是更好更快吗?
【发布时间】:2017-09-11 04:01:11
【问题描述】:
  1. 如果IQueryable接口在服务端执行查询表达式,而不是像IEnumerable这样获取所有记录,为什么IQueryable不被IEnumerable代替,这样可以更快更高效?

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

【问题讨论】:

    标签: c# linq ienumerable iqueryable


    【解决方案1】:
    1. 如果IQueryable在服务器中执行查询表达式而不是 而不是获取像IEnumerable 这样的所有记录,为什么IQueryable 不 替换为IEnumerable 哪里可以更快更高效?

    IQueryableIEnumerable 代表两个不同的东西。将IQueryable 视为“问题”,它本身没有任何结果。 IEnumerable 是一个“答案”,它只有与之相关的数据,但您不知道是什么生成了该数据。

    IQueryable 并不是说​​“更快”,它只是允许您将过滤和预测放入您向 SQL 服务器提出的“问题”中,并让它只返回它需要的答案(以IEnumerable 的形式调用.ToList() 或类似形式)。

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

    IQueryable 没有在任何地方都取代IEnumerable 的原因是因为您提出问题的对象必须能够理解您提出的问题。需要大量工作才能解析您可以要求它过滤或投影的所有可能的东西,因此大多数实现limit themselves to only common things they know they need to be able to answer。例如,在 Entity Framework 中,当您提出一个不了解如何处理的问题时,当您尝试获取 IEnumerable 时,您将收到类似于 "Specified method is not supported" 的错误信息(答案)来自IQueryable

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

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

    向服务器索取结果然后扔掉是很浪费的,所以我不建议这样做。

    【讨论】:

    • 您的示例(问题和答案)很棒,据我了解,IQueryable 在我将其转换为IEnumerable 列表以获得理想答案之前没有用处跨度>
    猜你喜欢
    • 1970-01-01
    • 2011-04-08
    • 2017-05-11
    • 2010-10-25
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2016-05-13
    相关资源
    最近更新 更多