gpt4 book ai didi

F# 查询串联

转载 作者:行者123 更新时间:2023-12-04 00:12:08 25 4
gpt4 key购买 nike

我在 F# 中使用 SqlDataConnection 数据提供程序来迁移一些行,迁移的一部分是像这样在 3 个表之间进行连接,将其视为表的继承 A , B, C 其中 BC 继承自 A所以我需要得到的是(类似 Linq 的):

        Bs.Join(As, b.PK, a.FK).Select(new {...})
.Concat(Cs.Join(As, c.PK, a.FK).Select(new {...})

F# 中,我最接近的是:

 let result = seq {
yield! query { ... }
yield! query { ... }
}

但有人告诉我这将产生 2 个 SQL 查询,并且总体结果将在内存中。问题是:有没有办法在不使用 seq 的情况下将这种“串联”作为 query 计算表达式,以便所有操作都发生在单个 SQL 查询中?

最佳答案

下面是一些使用 SQL UNIONUNION ALL 组合两个查询的示例代码。

首先,设置。请注意,我已将日志记录添加到 dbContext,因此您可以看到幕后发生的情况。

#r "System.Data.dll"
#r "System.Data.Linq.dll"
#r "FSharp.Data.TypeProviders.dll"

open System
open System.Linq
open Microsoft.FSharp.Data.TypeProviders

type sql = SqlDataConnection<connStr>

let createDbContext() =
let dbContext = sql.GetDataContext()
// add logging to console
dbContext.DataContext.Log <- System.Console.Out
dbContext

let db = createDbContext()
let products = db.Product

let q1 = query { for x in products do select x }
let q2 = query { for y in products do select y }

Union 扩展方法使用 UNION 将查询合并为一个查询

let qUnion = q1.Union(q2)
qUnion.ToList() |> Seq.toList

这是记录的输出:

SELECT [t2].[Id], [t2].[Name]
FROM (
SELECT [t0].[Id], [t0].[Name]
FROM [dbo].[Product] AS [t0]
UNION
SELECT [t1].[Id], [t1].[Name]
FROM [dbo].[Product] AS [t1]
) AS [t2]

Concat 扩展方法使用 UNION ALL 将查询合并为一个查询

let qConcat = q1.Concat(q2)
qConcat.ToList() |> Seq.toList

这是记录的输出:

SELECT [t2].[Id], [t2].[Name]
FROM (
SELECT [t0].[Id], [t0].[Name]
FROM [dbo].[Product] AS [t0]
UNION ALL
SELECT [t1].[Id], [t1].[Name]
FROM [dbo].[Product] AS [t1]
) AS [t2]

据我所知,query 表达式中的并集没有特殊的语法。

关于F# 查询串联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33178027/

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