【发布时间】:2015-01-27 16:41:55
【问题描述】:
如果我运行具有多个 where 子句、分组和 order by 语句的实体框架 linq 查询,这会占用我本地计算机上的资源还是在 SQL 服务器上运行?
【问题讨论】:
-
如果您的查询中没有任何具体化方法(期望最终结果的具体化),那么它将在您的 SQL Server 上运行。
标签: linq entity-framework
如果我运行具有多个 where 子句、分组和 order by 语句的实体框架 linq 查询,这会占用我本地计算机上的资源还是在 SQL 服务器上运行?
【问题讨论】:
标签: linq entity-framework
简短的回答是“两者”。您可以以这样一种方式构造您的查询,即大部分处理将在 RDBMS 端进行,并远程完成过滤、投影和聚合。但是,为了将数据转换为对象,客户端也需要做一些工作。
EF 查询通过IQueryable<T> 将您的 LINQ 表达式转换为 SQL,并将其发送到 RDBMS 以执行。当然,这会占用 RDBMS 方面的资源。
RDBMS 完成后,会将结果发送回客户端。此时,结果将转换为您通过 EF 检索的对象,将执行推迟到您需要它们的时候。如果您使用ToList() 或ToArray(),转换会立即发生。如果您在ToList()、ToArray() 或AsEnumerable() 调用之后使用附加子句,则会在客户端进行附加处理。
【讨论】:
Linq 使用本地资源,但在 EF 中进行的 SQL 转换在 SQL Server 上运行。
还有一些其他的复杂性。 Linq 在某些情况下使用惰性求值,因此它实际上可能不会一次将整个集合交给您。相反,它会为您提供一个状态引擎(本质上是一个yield return;一个IQueryable),它将根据您的代码要求生成记录。
【讨论】: