【发布时间】:2021-12-19 12:25:48
【问题描述】:
我已阅读以下内容:https://stackoverflow.com/a/20766203/10046099
我没有得到的是这部分:
创建表达式树是为了完成转换任务 将诸如查询表达式之类的代码转换为可以传递给的字符串 其他一些过程并在那里执行。就是这么简单。
如果我们得到了查询表达式,为什么不能直接将其转换成 sql 字符串发送到 sql 数据库?为什么需要树?因为它不是直接将查询表达式转换为sql字符串,而是先将其转换为树,然后将树转换为sql字符串,这意味着2步而不是1。
我希望得到最简单的解释。
更新
我们看下面的linq
IEnumerable<int> scoreQuery =
from score in scores
where score > 80
select score;
你能把它变成二叉树图的表达式树吗?也许在此之后,我会更容易将表达式树转换为 sql 字符串。
【问题讨论】:
-
"如果我们得到了查询表达式,为什么不能直接将其转换成 sql 字符串发送到 sql 数据库?" - 你期望这样做的“它”是什么? C# 编译器将 lambda 表达式视为源代码,但如果 C# 编译器必须了解 SQL,这将严重违反关注点分离。 (除了 SQL,可以使用当前架构处理的东西呢?您是否建议将 everything 捆绑在 C# 编译器中?如果您想支持 C# 编译器团队的查询语言怎么办?不喜欢?)
-
这意味着 2 个步骤而不是 1 个步骤 - 我有点好奇为什么你认为它是一件坏事。毕竟,当您编写 C# 时,CPU 不会运行 C#。它会在变成一堆 0 和 1/电压电平之前被转换很多次,所以你必须明白,在你的一生中,由于各种原因,中间步骤真的很方便——不仅仅是英特尔与 ARM CPU 或 WIndows 与 Linux。即使结果是,在数学考试中展示你的工作至少可以让你得到一些分数错误的。铁矿石冶炼厂不生产汽车。总体而言,直接从 A 到 Z 通常是个坏主意
-
您发布的语句不是 LINQ 表达式。它包含两个 LINQ 表达式:
score > 80和score。 -
@IanMercer 我想了解如果 Linq 转换为表达式树,表达式树如何知道如何将其转换为特定的 sql 数据库?它可能是 sql、postgresql、mysql 或任何最终可能具有不同语法的东西。 ?
-
如果您看不到某个功能的用途,我通常会建议您将其放在“可能很有趣,但现在与我无关”的堆中。稍后,如果您遇到问题并且有人为您提供了使用该功能的解决方案,您将有一个真实、令人信服、与您相关的理由来说明它为什么有用。同时,您无需要求其他人证明该功能的存在是合理的。也许它永远不会与你相关——那也没关系。