【问题标题】:Where does EF linq skip / take execute?EF linq 在哪里跳过/执行?
【发布时间】:2014-11-03 10:32:56
【问题描述】:

我有:

IQueryable<Entity> query = (from e in Context.Set<TEntity>() select e);
IEnumerable<TEntity> result = query.OrderBy(x=>x.Property).Skip(10).Take(10);

OrderBy/Skip/Take 返回IEnumerable&lt;T&gt;。我担心会发生什么,所有的结果都会被返回,然后Linq会被用来只取其中的一部分。

我的问题是:OrderBy/Skip 和 Take 是否包含在发出的 SQL 查询中,以便只返回总结果的请求子集?

【问题讨论】:

  • 您是否在监控 SQL Server 时尝试过? Some insights here.
  • IQueryable 被编译为 sql。所以,是的,只返回总结果的请求子集
  • 作为一个附带主题,我建议您阅读有关延迟执行的内容。 blogs.msdn.com/b/charlie/archive/2007/12/09/…
  • 我会做一些阅读,我急需这个答案。非常感谢大家的回答和cmets。选择哪一个作为答案..?

标签: c# linq entity-framework


【解决方案1】:

OrderBy/Skip/Take 返回IEnumerable&lt;T&gt;

OrderByhas an overload that returns IOrderedQueryable&lt;T&gt;,不仅仅是IOrderedEnumerable&lt;T&gt;SkipTake 也是如此。 C# 编译器足够聪明,可以更喜欢这些重载而不是返回 IEnumerable&lt;T&gt; 的重载,只要您不强制它这样做。该操作将在数据库中执行,只要您不要过早将其转换为IEnumerable

【讨论】:

    【解决方案2】:

    OrderBy/Skip 和 Take 是否包含在发出的 SQL 查询中,以便仅返回总结果的请求子集?

    是的,所有这些方法都受支持,它们将被转换为 SQL。整个列表是 here,正如您所见,每个采用 IQueryable&lt;T&gt; 的方法都有重载。

    【讨论】:

      【解决方案3】:

      是的,它们被翻译成 SQL 并直接针对数据库执行。

      【讨论】:

        猜你喜欢
        • 2018-12-03
        • 1970-01-01
        • 2012-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-28
        相关资源
        最近更新 更多