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!)
ale w jaki sposób mogę wykorzystać tutaj plon? Nie chcę zwracać "(none)" w ogóle – Cynede
Nie sądzę, że funkcja 'groupJoin' obsługuje to, ale zawsze możesz dodać' |> Seq.filter', aby usunąć wszystkie elementy z wartością "null" . –