2012-08-22 219 views
27

可能重複:
How do you perform a left outer join using linq extension methods左外連接中的LINQ

我不能找到的LINQ拉姆達的左外連接的例子(與擴展方法),至少,不是一個明確的。

比方說,我有如下表:

Parent 
{ 
    PID  // PK 
} 

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

我想參加家長與兒童,併爲每一個孩子不見了,我要爲文本設置爲默認值「[空]」。我怎樣才能用linq lambda語法來做到這一點?

目前,我有以下幾點:

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

你有什麼已經嘗試過? 「linq lambda」是什麼意思? –

+0

我不明白你想做什麼! – MAXE

+2

@mellamokm哦非常有幫助,所有這些例子都在lambda語法!哦,等等,不,他們不是。 -_- – ProgrammerAtWork

回答

70

你靠近。下面將選擇PID,爲每個父CIDText爲每一個孩子,和PIDCID = -1Text = "[[Empty]]"沒有孩子:

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

謝謝!最後一個明確的答案。 – ProgrammerAtWork

+3

Thankyou - 一直在尋找答案几個小時。 – 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]]" 
} 

和λ:

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

這不是lambda語法。 – Rawling

+0

謝謝。編輯我的答案。 –

+2

只是爲了防止有人構建錯誤 - g.DefaultIfEmpty最後需要括號。即。 g.DefaultIfEmpty() –