首页 > 解决方案 > F#如何为主从数据构造一个Linq查询?

问题描述

我正在使用 SQLProvider 从 SQL Server 获取数据。

我的查询如下所示。问题是它为订单详细信息的每一行提供了一个订单记录。我理解为什么,因为如果我在 SQL 中做这个结构,它会给我连接值。

不过,我想创建一个层次结构 - 一个具有许多订单详细信息的订单记录(甚至作为元组)。我只是无法理解它。我已经尝试了不同级别的各种代码块,但它不起作用。

    let orders = 
        query { 
            for o in ctx.Dbo.Orders do
                for od in o.``dbo.OrderDetails by id`` do
                    select (o , od)
        } |> Seq.map (fun (o,od ) -> o.MapTo<Order>(), od.MapTo<OrderDetail>()) |> Seq.toList
    orders

标签: f#

解决方案


我认为groupJoin查询运算符是为此目的而设计的,但SQLProvider 似乎不支持它。相反,您可能必须执行以下操作:

let orders =
    query {
        for o in ctx.Dbo.Orders do
            let ods =
                o.``dbo.OrderDetails by OrderID``
                    |> Seq.toArray
            select (o, ods)
    }
for (o, ods) in orders do
    printfn "Order %A: %A details" o.OrderId ods.Length

这导致每个订单有一行,每个订单都有一系列详细信息,这就是我认为您所要求的。输出如下:

Order 10248: 3 details
Order 10249: 2 details
Order 10250: 3 details
Order 10251: 3 details
Order 10252: 3 details
Order 10253: 3 details
Order 10254: 3 details
Order 10255: 4 details
...

推荐阅读