在 Kotlin Slack 上讨论了添加代码树以支持 C# LINQ 等东西的可能性。
在 C# 中,LINQ 有很多应用程序,但我只想关注一个(因为 Kotlin 语法可能已经涵盖了其他应用程序):将 SQL 查询组合到远程数据库。
先决条件:
问题:表达式树向对手头任务至关重要的语法添加了什么?没有它们,SQL 构建器能有多好?
没有表达式树的查询 dsl 有多好?
作为JINQ已经表明您可以通过分析字节码来理解开发人员的意图,从而将谓词转换为 SQL,从而走得更远。所以原则上表达式树对于构建一个漂亮的查询 dsl 不是必不可少的:
val alices = database.customerStream().where { it.name == "Alice" }
即使没有像字节码分析这样的 hackery,也有可能通过代码生成获得一个像样的查询 dsl。 Querydsl和 JOOQ是很好的例子。使用一点 Kotlin 包装代码,您就可以编写
val alices = db.findAll(QCustomer.customer, { it.name.eq("Alice") })
表达式树如何帮助构建查询dsl
表达式树是一种结构,表示解析为一个值的一些代码。通过编译器生成这样的结构,不需要字节码分析来理解应该做什么。举个例子
val alices = database.customerStream().where { it.name == "Alice" }
where
函数的参数是一个表达式
,我们可以在运行时对其进行检查并将其转换为 SQL 或其他查询语言。因为表达式树代表代码,所以您无需在 Kotlin 和 SQL 范式之间切换来编写查询。使用 linq/jinq 表达的查询代码看起来几乎相同,无论它们是使用 POCO/POJO 在内存中执行还是使用其查询语言在数据库引擎中执行。编译器还可以做更多的类型检查。此外,很容易用内存表示替换底层数据库,从而使运行测试更快。
进一步阅读: