Присоединиться к 2 списку записей, основанных на том же ярлыке в F # - PullRequest
0 голосов
/ 04 июля 2019

У меня есть 2 списка записей с одним и тем же ярлыком id1. Мне нужен способ присоединиться к ним.

type A = { id1: int; name: string }

type B = { id1: int; id2: Option<int> }

let a1 = { id1 =  1; name = "nafis" }
let a2 = { id1 =  2; name = "habib" }

let b1 = { id1 = 1; id2 = Some(5) }
let b2 = { id1 = 1; id2 = None }
let b3 = { id1 = 2; id2 = None }

let a = [a1; a2]
let b = [b1; b2; b3]

printfn "%A" a =>  [({id1 = 1;name = "nafis";}, {id1 = 2;name = "habib";})]
printfn "%A" b =>  
[({id1 = 1; id2 = Some 5;}, {id1 = 1; id2 = None;}, {id1 = 2;id2 = None;})]

Как я могу присоединиться к этим 2 спискам на основе id1?

Я хочу такой вывод =>

[({id1 = 1;name = "nafis"; id2 = [Some 5; None];}, {id1 = 2;name = "habib"; id2 =[None];})]

Некоторая форма учебника или ссылки на блог будет полезна.

1 Ответ

3 голосов
/ 04 июля 2019

MSDN: Выражения запроса позволяют запрашивать источник данных и помещать данные в нужную форму. Выражения запроса обеспечивают поддержку LINQ в F #.

Как правильно указано в комментариях, вам нужен третий тип C, который будет содержать объединенный результат, а затем использовать старый добрый LINQ для присоединения к спискам:

type A = { id1: int; name: string }
type B = { id1: int; id2: Option<int> }
type C = { id1: int; name: string; id2: Option<int> }

let a1 = { id1 =  1; name = "nafis" }
let a2 = { id1 =  2; name = "habib" }

let b1 = { id1 = 1; id2 = Some(5) }
let b2 = { id1 = 1; id2 = None }
let b3 = { id1 = 2; id2 = None }

let a = [a1; a2]
let b = [b1; b2; b3]

let result (a:A list) (b: B list) = query {
    for list1 in a do
    join list2 in b on
        (list1.id1 = list2.id1)
    select {id1 = list1.id1; name = list1.name; id2= list2.id2}
}

let c = result a b |> List.ofSeq

Результат:

val c : C list = [{id1 = 1;
               name = "nafis";
               id2 = Some 5;}; {id1 = 1;
                                name = "nafis";
                                id2 = None;}; {id1 = 2;
                                               name = "habib";
                                               id2 = None;}]
...