F#查询连接
我在F#中使用F#查询连接,f#,type-providers,F#,Type Providers,我在F#中使用SqlDataConnection数据提供程序来迁移一些行,迁移的一部分是在3个表之间建立这样的连接,将其视为表a,B,C的继承,其中B和C继承自a,所以我需要得到的是(类似林克语): 在F#中,我最接近这一点的是: let result = seq { yield! query { ... } yield! query { ... } } 但有人告诉我,这将产生2个SQL查询,总体结果将取决于内存。问题是:有没有办法实现这种“连接”作为一个查询计算表达式
SqlDataConnection
数据提供程序来迁移一些行,迁移的一部分是在3个表之间建立这样的连接,将其视为表a
,B
,C
的继承,其中B
和C
继承自a
,所以我需要得到的是(类似林克语):
在F#
中,我最接近这一点的是:
let result = seq {
yield! query { ... }
yield! query { ... }
}
但有人告诉我,这将产生2个SQL查询,总体结果将取决于内存。问题是:有没有办法实现这种“连接”作为一个
查询
计算表达式,而不使用seq
,因此所有查询都发生在一个SQL查询中?下面是一些示例代码,它使用SQLUNION
或UNION 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 }
以下是记录的输出:
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]
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]
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
SELECT [t1].[Id], [t1].[Name]
FROM [dbo].[Product] AS [t1]
) AS [t2]
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
表达式中没有特殊的联合语法。请问(query{…}).Concat(query{…})有什么问题吗
?就像在C#中一样,您需要打开System.Linq
命名空间才能访问Concat
扩展方法。@kvb不起作用,解释器说:意外的符号'。'在绑定中听起来好像缺少括号什么的。我只是打开System.Linq
然后(查询{simple query}).Concat(查询{另一个简单查询})
我得到了同样的错误这对我来说很有效:(查询{for x in[1..3].AsQueryable()确实选择x}).Concat(查询{for y in[4..6].AsQueryable()确实选择y})