2012-08-22 9 views
27

Duplicar posibles:
How do you perform a left outer join using linq extension methodsexterna izquierda en la sintaxis/método lambda en LINQ

no puedo encontrar una unión externa izquierda ejemplo de LINQ lambda (con métodos de extensión), al menos, no es claro.

Digamos que tengo el siguiente cuadro:

Parent 
{ 
    PID  // PK 
} 

Child 
{ 
    CID  // PK 
    PID  // FK 
    Text 
} 

Quiero unirme a los padres con el niño, y por faltar a todos los niños, quiero que el valor por defecto de texto que se va "[[vacío]]". ¿Cómo puedo hacer esto con la sintaxis de linq lambda?

Actualmente tengo el siguiente:

var source = lParent.GroupJoin(
    lChild, 
    p => p.PID, 
    c => c.PID, 
    (p, g) => 
     new // ParentChildJoined 
     { 
      PID = p.PID; 
      // How do I add child values here? 
     }); 
+1

¿Qué has intentado ya? ¿Y qué quiere decir con "linq lambda"? –

+0

¡No puedo entender lo que estás tratando de hacer! – MAXE

+2

@mellamokm oh muy útil, ¡todos esos ejemplos están en sintaxis lambda! oh espera, no, no lo están. -_- – ProgrammerAtWork

Respuesta

70

Estás cerca. A continuación se seleccionará PID, CID y Text para cada niño, y PID, CID = -1 y Text = "[[Empty]]" para cada padre sin hijos:

var source = lParent.GroupJoin(
    lChild, 
    p => p.PID, 
    c => c.PID, 
    (p, g) => g 
     .Select(c => new { PID = p.PID, CID = c.CID, Text = c.Text }) 
     .DefaultIfEmpty(new { PID = p.PID, CID = -1, Text = "[[Empty]]" })) 
    .SelectMany(g => g); 
+5

¡Gracias! Finalmente una respuesta clara. – ProgrammerAtWork

+3

Gracias - estado buscando una respuesta por horas. – markp3rry

7
from p in Parent 
join c in Child on p.PID equals c.PID into g 
from c in g.DefaultIfEmpty 
select new 
{ 
    p.PID, 
    CID = c != null ? (int?)c.CID : null, // Could be null 
    Text = c != null ? c.Text : "[[Empty]]" 
} 

Con lambda:

class ChildResult 
{ 
    public int PID { get; set; } 
    public int? CID { get; set; } 
    public string Text { get; set; } 
} 

lParent.SelectMany(p => p.Childs.Any() ? 
    p.Childs.Select(c => new ChildResult() { PID = c.PID, CID = c.CID, Text = c.Text }) : 
    new [] { new ChildResult() { PID = p.PID, CID = null, Text = "[[Empty]]" } }); 
+2

Esto no es sintaxis lambda. – Rawling

+0

Gracias. Editado mi respuesta. –

+2

por si alguien tiene un error de compilación - g.DefaultIfEmpty necesita paréntesis al final. es decir. g.DefaultIfEmpty() –

Cuestiones relacionadas