Creo que puede utilizar la función groupJoin
disponible en el módulo Query
. Aquí hay un ejemplo usando Neptuno con productos como la tabla primaria y Categorías como la tabla de clave externa:
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
Definitivamente, hay maneras más agradables de expresar esto utilizando la sintaxis seq { .. }
y mediante la realización comportamiento unirse como anidadas utilizando for
bucles. Desafortunadamente, las citas del traductor de LINQ probablemente no sean compatibles. (Personalmente, preferiría escribir el código usando for
anidado y usando if
para verificar si hay una colección vacía).
Estaba mirando algunas mejoras en la biblioteca PowerPack como parte de un trabajo de contratación para el equipo de F #, por lo que espera que esto mejore en el futuro ... (pero sin promesas!)
pero ¿cómo puedo usar el rendimiento aquí? No quiero volver "(ninguno)" en absoluto – Cynede
No creo que la función 'groupJoin' lo admita, pero siempre puede agregar' |> Seq.filter' para descartar todos los elementos con valor 'null' . –