2011-01-10 6 views
9

pregunta casi lo dice todo. Tengo una consulta grande flinq de la siguiente forma:cómo unirse al exterior en F # usando FLinq?

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

través de este formulario, ¿cómo puedo hacer una combinación externa izquierda entre estas dos tablas?

Respuesta

5

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!)

+0

pero ¿cómo puedo usar el rendimiento aquí? No quiero volver "(ninguno)" en absoluto – Cynede

+0

No creo que la función 'groupJoin' lo admita, pero siempre puede agregar' |> Seq.filter' para descartar todos los elementos con valor 'null' . –

0

tal vez debería cree una vista en la base de datos que realizó la combinación externa izquierda, y luego LINQ sobre esa vista.

0

Terminé creando consultas separadas para cada combinación externa y llamándola en ciertos puntos al recorrer el conjunto de resultados de la consulta más externa.

Cuestiones relacionadas