como se unir externamente em F # usando FLinq?

9

pergunta praticamente diz tudo. Eu tenho uma grande consulta flinq da seguinte forma:

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

usando este formulário, como posso fazer uma junção externa esquerda entre essas duas tabelas?

    
por Ramy 10.01.2011 в 20:57
fonte

3 respostas

5

Acho que você pode usar a função groupJoin disponível no módulo Query . Aqui está um exemplo usando o Northwind com produtos como a tabela principal e Categorias como a tabela com chave estrangeira:

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

Existem maneiras definitivamente mais agradáveis de expressar isso usando a sintaxe seq { .. } e implementando o comportamento de junção usando loops for aninhados. Infelizmente, as citações para o tradutor LINQ provavelmente não as suportarão. (Pessoalmente, eu preferiria escrever o código usando aninhado for e usando if para verificar se há coleção vazia).

Eu estava apenas olhando para algumas melhorias na biblioteca do PowerPack como parte de um trabalho de contratação para a equipe de F #, então isso irá melhorar no futuro ... (mas sem promessas!)

    
por Tomas Petricek 11.01.2011 / 00:20
fonte
0

Talvez você deva criar uma visualização no banco de dados que realizou a junção externa esquerda e, em seguida, LINQ sobre essa visualização.

    
por ninegrid 18.02.2011 / 19:43
fonte
0

Acabei criando consultas separadas para cada junção externa e chamando isso em determinados pontos ao fazer um loop pelo conjunto de resultados da consulta mais externa.

    
por Ramy 18.02.2011 / 20:02
fonte