2012-08-22 16 views
27

Eventuali duplicati:
How do you perform a left outer join using linq extension methodsjoin esterno sinistro in/metodo di sintassi lambda in LINQ

non riesco a trovare una sinistra outer join esempio di Linq lambda (con metodi di estensione), almeno, non chiaro.

Diciamo che ho la seguente tabella:

Parent 
{ 
    PID  // PK 
} 

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

voglio unirmi genitore con il bambino, e per ogni bambino scomparso, voglio che il valore predefinito per il testo da "[[vuoto]]". Come posso farlo con la sintassi di linq lambda?

Al momento ho il seguente:

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

Cosa avete già provato? E cosa intendi con "linq lambda"? –

+0

Non riesco a capire cosa stai cercando di fare! – MAXE

+2

@mellamokm oh molto utile, tutti quegli esempi sono nella sintassi lambda! oh aspetta, no non lo sono. -_- – ProgrammerAtWork

risposta

70

Stai vicino. Di seguito selezionerà PID, CID e Text per ogni bambino, e PID, CID = -1 e Text = "[[Empty]]" per ciascun genitore senza figli:

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

Grazie! Finalmente una risposta chiara. – ProgrammerAtWork

+3

Grazie - cercavo una risposta per ore. – 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

Questa non è la sintassi lambda. – Rawling

+0

Grazie. Modificato la mia risposta. –

+2

nel caso in cui qualcuno abbia generato un errore - g.DefaultIfEmpty ha bisogno di parentesi alla fine. vale a dire. g.DefaultIfEmpty() –

Problemi correlati