Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#查询连接_F#_Type Providers - Fatal编程技术网

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查询,总体结果将取决于内存。问题是:有没有办法实现这种“连接”作为一个查询计算表达式

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

F#
中,我最接近这一点的是:

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

但有人告诉我,这将产生2个SQL查询,总体结果将取决于内存。问题是:有没有办法实现这种“连接”作为一个
查询
计算表达式,而不使用
seq
,因此所有查询都发生在一个SQL查询中?

下面是一些示例代码,它使用SQL
UNION
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})