当运行在entity framework中进行复杂的行查询时,查询运行在哪里?
When running a complicated line query in entity framework, where does the query run?
如果我 运行 一个具有多个 where 子句、分组和 order by 语句的 Entity Framework linq 查询,它会占用我本地计算机上的资源还是 运行 SQL 服务器?
Linq 使用本地资源,但 EF 中发生的 SQL 转换在 SQL 服务器上运行。
还有其他一些复杂的问题。 Linq 在某些情况下使用惰性计算,因此它实际上可能不会立即将内存中的整个集合交给您。相反,它将为您提供一个状态引擎(yield return
,本质上是一个 IQueryable
),它将根据您的代码需要生成记录。
简短的回答是 "both"。您可以按照这样一种方式构建查询,即大部分处理在 RDBMS 端进行,过滤、预测和聚合是远程完成的。但是,为了将数据转换为对象,客户端也需要做一些工作。
EF 查询通过 IQueryable<T>
将您的 LINQ 表达式转换为 SQL,并将其发送到 RDBMS 以执行。当然,这会占用 RDBMS 端的资源。
RDBMS 完成后,结果将发送回客户端。届时,结果将转换为您通过 EF 检索的对象,将执行推迟到您需要它们的时候。如果您使用 ToList()
或 ToArray()
,转换会立即发生。如果您在 ToList()
、ToArray()
或 AsEnumerable()
调用后使用附加子句,则会在客户端进行附加处理。
如果我 运行 一个具有多个 where 子句、分组和 order by 语句的 Entity Framework linq 查询,它会占用我本地计算机上的资源还是 运行 SQL 服务器?
Linq 使用本地资源,但 EF 中发生的 SQL 转换在 SQL 服务器上运行。
还有其他一些复杂的问题。 Linq 在某些情况下使用惰性计算,因此它实际上可能不会立即将内存中的整个集合交给您。相反,它将为您提供一个状态引擎(yield return
,本质上是一个 IQueryable
),它将根据您的代码需要生成记录。
简短的回答是 "both"。您可以按照这样一种方式构建查询,即大部分处理在 RDBMS 端进行,过滤、预测和聚合是远程完成的。但是,为了将数据转换为对象,客户端也需要做一些工作。
EF 查询通过 IQueryable<T>
将您的 LINQ 表达式转换为 SQL,并将其发送到 RDBMS 以执行。当然,这会占用 RDBMS 端的资源。
RDBMS 完成后,结果将发送回客户端。届时,结果将转换为您通过 EF 检索的对象,将执行推迟到您需要它们的时候。如果您使用 ToList()
或 ToArray()
,转换会立即发生。如果您在 ToList()
、ToArray()
或 AsEnumerable()
调用后使用附加子句,则会在客户端进行附加处理。