c# - LINQ 相对于函数式方法链的优势

标签 c# sql linq expression-trees kotlin

<分区>

在 Kotlin Slack 上讨论了添加代码树以支持 C# LINQ 等东西的可能性。

在 C# 中,LINQ 有很多应用程序,但我只想关注一个(因为 Kotlin 语法可能已经涵盖了其他应用程序):将 SQL 查询组合到远程数据库。

先决条件:

  • 我们有一个以某种方式在代码中表达的 SQL 数据库的数据模式,以便静态工具(或类型系统)可以检查 SQL 查询的正确性(至少是命名)

    <
  • 我们必须将查询生成为字符串

  • 我们想要一种接近于 SQL 或 Java 流的语法

问题:表达式树向对手头任务至关重要的语法添加了什么?没有它们,SQL 构建器能有多好?

最佳答案

没有表达式树的查询 dsl 有多好?

作为JINQ已经表明您可以通过分析字节码来理解开发人员的意图,从而将谓词转换为 SQL,从而走得更远。所以原则上表达式树对于构建一个漂亮的查询 dsl 不是必不可少的:

val alices = database.customerStream().where { it.name == "Alice" }

即使没有像字节码分析这样的 hackery,也有可能通过代码生成获得一个像样的查询 dsl。 QuerydslJOOQ是很好的例子。使用一点 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 在内存中执行还是使用其查询语言在数据库引擎中执行。编译器还可以做更多的类型检查。此外,很容易用内存表示替换底层数据库,从而使运行测试更快。

进一步阅读:

关于c# - LINQ 相对于函数式方法链的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38220379/

相关文章:

c# - 在 Visual Studio 中使用命令窗口

java - 在java中获取第一个记录表单数据库?

sql - 获取列中值的最大计数

c# - LINQ 根据内部集合值选择

linq - ExpressionVisitor.Visit<T> 有什么作用?

c# - 将哈希值转换为十六进制字符串

c# - 模拟使用最小起订量的异步回调的方法

c# - 使用 Datalist C# 从 SQL Server 2008 中删除多个表

c# - 使用 Linq to Sql 在序列中查找漏洞

c# - 使用扩展方法来类型转换一个坏主意吗?