谁负责将 LINQ 表达式树转换为原生 SQL?

Who is responsible for transforming LINQ espression tree to a native SQL?

当使用 ORM 并使用 LINQ 编写查询时,谁负责将 LINQ espression 树转换为本机 SQL?是 ORM 本身还是 CLR?还是别的?

正如 Philippe 在评论中所说 - ORM 做到了。 CLR只是将你的LINQ表达式编译为表达式树,并将这个对象传递给与ORM相关的IQueryProvider

然后这个 IQueryProvider 使用自定义 ExpressionVisitor 类 解析这个表达式。然后根据解析结果 - ORM 生成纯 SQL 代码,执行它并具体化结果。

一些ORM对此过程进行了优化。例如 Entity Framework 将解析后的信息保存在内存中,类似于 SQL Execution Plans,然后在以后的查询中使用它,因此它只解析一次,然后重新使用从表达式树中解析出的数据。

如果表达式树没有链接参数,那就简单了。否则它需要为每次执行再次部分重新解析它以获取使用的参数并用它们生成 SQL。