gpt4 book ai didi

c# - LINQ 中类似 Scala 集合的 SQL 支持

转载 作者:可可西里 更新时间:2023-11-01 08:31:41 24 4
gpt4 key购买 nike

据我所知,LINQ 唯一支持的是与 SQL 数据库的集成,而 Scala 目前不支持其集合库。

据我所知,LINQ 可以“累积”各种操作,并且可以在查询时将“整个”语句提供给数据库以在那里进行处理,从而防止简单的 SELECT 首先复制整个表进入 VM 的数据结构。

如果我错了,我很乐意得到纠正。

如果没有,在 Scala 中支持相同的内容有什么必要?

是否可以编写一个实现集合接口(interface)的库,但没有任何数据结构支持它,而是一个字符串,它与以下集合一起组装到所需的数据库语句中?

还是我的观察完全错误?

最佳答案

作为 ScalaQuery 的作者,我对 Stilgar 的解释没有太多要补充的。 Scala 中缺少的 LINQ 部分确实是表达式树。这就是为什么 ScalaQuery 对 Column 和 Table 类型而不是这些实体的基本类型执行所有计算的原因。

您将表声明为具有其列的投影(元组)的 Table 对象,例如:

class User extends Table[(Int, String)] {
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def * = id ~ name
}

User.id 和 User.name 现在分别是 Column[Int] 和 Column[String] 类型。所有计算都在 Query monad 中执行(与必须从中创建的 SQL 语句相比,这是数据库查询的更自然表示)。进行以下查询:

val q = for(u <- User if u.id < 5) yield u.name

经过一些隐式转换和脱糖后,这转化为:

val q:Query[String] =
Query[User.type](User).filter(u => u.id < ConstColumn[Int](5)).map(u => u.name)

filter 和 map 方法不必检查它们作为表达式树的参数来构建查询,它们只是运行它们。从类型可以看出,表面上看起来像“u.id:Int < 5:Int”的实际上是“u.id:Column[Int] < u.id:Column[Int]”。运行此表达式会生成查询 AST,如 Operator.Relational("<", NamedColumn("user", "id"), ConstColumn(5))。同样,Query monad 的“filter”和“map”方法实际上并不执行过滤和映射,而是构建一个描述这些操作的 AST。

QueryBuilder 然后使用这个 AST 为数据库构造实际的 SQL 语句(使用特定于 DBMS 的语法)。

ScalaQL 采取了另一种方法它使用编译器插件直接处理表达式树,确保它们只包含数据库查询中允许的语言子集,并静态构造查询。

关于c# - LINQ 中类似 Scala 集合的 SQL 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4366147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com