/ / лявата външна връзка в ламбда / синтактичния метод в Linq [дубликат] - c #, .net, linq

ляво външно свързване в ламбда / синтактичен метод в Linq [дубликат] - c #, .net, linq

Възможно дублиране:
Как изпълнявате лявата външна връзка посредством методите за разширение на linq

Не мога да намеря ляв пример за външна връзка на Linq ламбда (с методи за разширение), поне не ясна.

Да кажем, че имам следната таблица:

Parent
{
PID     // PK
}

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

Искам да се присъединя към родител с дете и за всяко дете, което липсва, искам стойността по подразбиране за текста да е "[[празна]]". Как мога да направя това с linq ламбда синтаксис?

Понастоящем имам следното:

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?
});

Отговори:

70 за отговор № 1

След това ще изберете PID, CID и Text за всяко дете и PID, CID = -1 и Text = "[[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);

7 за отговор № 2
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]]" } } );