2011-01-10 11 views
9

pytanie prawie wszystko mówi. Mam duże kwerendę flinq z poniższego formularza:jak połączyć zewnętrzne w F # za pomocą FLinq?

for alias1 in table1 do 
    for alias2 in table2 do 
     if alias1.Id = alias2.foreignId 

za pomocą tego formularza, w jaki sposób mogę zrobić lewe sprzężenie zewnętrzne między tymi dwiema tabelami?

Odpowiedz

5

Myślę, że można użyć funkcji groupJoin dostępnej w module Query. Oto przykład przy użyciu Northwind z produktami jako podstawowy tabeli i kategoriach tabeli z kluczem obcym:

open System.Linq 

<@ Query.groupJoin 
    db.Products db.Categories 
    (fun p -> p.CategoryID.Value) 
    (fun c -> c.CategoryID) 
    (fun p cats -> 
     // Here we get a sequence of all categories (which may be empty) 
     let cat = cats.FirstOrDefault() 
     // 'cat' will be either a Category or 'null' value 
     p.ProductName, if cat = null then "(none)" else cat.CategoryName) @> 
|> query 

Są zdecydowanie ładniejsze sposoby wyrażania tego używając składni seq { .. } oraz poprzez realizację przyłączenia, jak zachowanie przy użyciu zagnieżdżony for pętle. Niestety, oferty na tłumacza LINQ prawdopodobnie nie będą tego wspierać. (Osobiście wolałbym napisać kod za pomocą zagnieżdżonego for i użyć if, aby sprawdzić puste zbiory).

właśnie patrząc na pewną poprawę w bibliotece PowerPack jak część prac zamawiający do zespołu F #, więc mam nadzieję, że będzie to poprawić w przyszłości ... (ale nie obiecuje!)

+0

ale w jaki sposób mogę wykorzystać tutaj plon? Nie chcę zwracać "(none)" w ogóle – Cynede

+0

Nie sądzę, że funkcja 'groupJoin' obsługuje to, ale zawsze możesz dodać' |> Seq.filter', aby usunąć wszystkie elementy z wartością "null" . –

0

Może powinieneś utworzyć widok w bazie danych, która wykonała lewe sprzężenie zewnętrzne, a następnie LINQ nad tym widokiem.

0

Skończyłem, tworząc osobne zapytania dla każdego zewnętrznego sprzężenia i wywołując je w pewnych punktach podczas przechodzenia przez zestaw wyników zewnętrznego zapytania.

Powiązane problemy