【问题标题】:When running a complicated line query in entity framework, where does the query run?在实体框架中运行复杂的线查询时,查询在哪里运行?
【发布时间】:2015-01-27 16:41:55
【问题描述】:

如果我运行具有多个 where 子句、分组和 order by 语句的实体框架 linq 查询,这会占用我本地计算机上的资源还是在 SQL 服务器上运行?

【问题讨论】:

  • 如果您的查询中没有任何具体化方法(期望最终结果的具体化),那么它将在您的 SQL Server 上运行。

标签: linq entity-framework


【解决方案1】:

简短的回答是“两者”。您可以以这样一种方式构造您的查询,即大部分处理将在 RDBMS 端进行,并远程完成过滤、投影和聚合。但是,为了将数据转换为对象,客户端也需要做一些工作。

EF 查询通过IQueryable<T> 将您的 LINQ 表达式转换为 SQL,并将其发送到 RDBMS 以执行。当然,这会占用 RDBMS 方面的资源。

RDBMS 完成后,会将结果发送回客户端。此时,结果将转换为您通过 EF 检索的对象,将执行推迟到您需要它们的时候。如果您使用ToList()ToArray(),转换会立即发生。如果您在ToList()ToArray()AsEnumerable() 调用之后使用附加子句,则会在客户端进行附加处理。

【讨论】:

    【解决方案2】:

    Linq 使用本地资源,但在 EF 中进行的 SQL 转换在 SQL Server 上运行。

    还有一些其他的复杂性。 Linq 在某些情况下使用惰性求值,因此它实际上可能不会一次将整个集合交给您。相反,它会为您提供一个状态引擎(本质上是一个yield return;一个IQueryable),它将根据您的代码要求生成记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多